2010-02-13 3 views
1

Я хотел бы перенаправить на другую страницу в методе действий, когда, например, возникает определенное исключение или сбой авторизации. Это не проблема с обычными запросами, однако, когда запрос выполняется через Ajax, перенаправление не выполняется. Многие люди, кажется, предлагают мне отправить JavaScriptResult и изменить document.location, но я не уверен, что это лучшее решение. Есть ли альтернативные способы достижения этого? Благодарю.Как я могу перенаправить в ASP.MVC при выполнении запроса Ajax?

P.S. Я использую ASP.NET MVC v1.0.

+0

Вы хотите страницу, на которой запрос был изменен? или пункт назначения вашего запроса AJAX? Если вы wnt браузер, чтобы изменить ответ ниже, это способ. –

ответ

3

Единственный способ сделать «переадресацию» через AJAX - это использовать javascript, передаете ли вы JavaScriptResult со сценарием, который устанавливает местоположение или новый URL-адрес в JSON и задает местоположение в обработчике обратного вызова. Я думаю, что выбор действительно зависит от того, как вы будете обрабатывать результат запроса иначе. Если он всегда будет перенаправлен, я просто сделаю запрос без AJAX. Если вы обычно возвращаете HTML, который помещается на страницу, тогда JavaScriptResult может быть лучше. Если вы обычно получаете JSON и обновляете страницу с помощью кода, я отправляю ответ JSON, содержащий URL-адрес, и пусть обработчик обратного вызова установит местоположение.

+0

Спасибо. Параметр JavaScriptResult кажется своего рода взломом, поэтому я поеду с опцией JSON, которая выглядит более понятной. – Zoman

5

Я пытался сделать то же самое, и этот url был большой помощью для меня. Я немного изменил его, чтобы он работал с RedirectResult, а также с Redirect.

http://craftycodeblog.com/2010/05/15/asp-net-mvc-ajax-redirect/

Просто все ваши контроллеры наследуют от этого базового контроллера.

public abstract class MyBaseController : Controller { 

      protected override RedirectToRouteResult RedirectToRoute(string routeName, System.Web.Routing.RouteValueDictionary routeValues) { 
       return new AjaxAwareRedirectResult(Url, routeName, routeValues); 
      } 

      public class AjaxAwareRedirectResult : RedirectToRouteResult { 
       public AjaxAwareRedirectResult(UrlHelper url, string routeName, System.Web.Routing.RouteValueDictionary routeValues) 
        : base(routeName, routeValues) { 
        this.url = url; 
       } 

       private readonly UrlHelper url; 

       public override void ExecuteResult(ControllerContext context) { 
        if (context.RequestContext.HttpContext.Request.IsAjaxRequest()) { 
         string destinationUrl = url.RouteUrl(base.RouteName, base.RouteValues); 
         JavaScriptResult result = new JavaScriptResult() 
         { 
          Script = "window.location='" + destinationUrl + "';" 
         }; 
         result.ExecuteResult(context); 
        } else { 
         base.ExecuteResult(context); 
        } 
       } 
      } 

     } 
Смежные вопросы