在发出Ajax请求时,如何在ASP.MVC中重定向?

时间:2010-02-13 22:00:56

标签: asp.net-mvc ajax

我想在例如某个异常发生或授权失败时重定向到操作方法中的另一个页面。这不是普通请求的问题,但是当通过Ajax发出请求时,重定向失败。 许多人似乎建议我发回JavaScriptResult并更改document.location,但我不确定这是否是最佳解决方案。有没有其他方法可以实现这一目标?感谢。

P.S。我正在使用ASP.NET MVC v1.0。

2 个答案:

答案 0 :(得分:5)

我试图这样做,这个网址对我来说是一个很大的帮助。我稍微修改了它,以便它可以使用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);
                    }
                }
            }

        }

答案 1 :(得分:3)

通过AJAX进行“重定向”的唯一方法是使用javascript,无论是使用在JSON中设置位置或新URL的脚本传回JavaScriptResult,还是在回调处理程序中设置位置。我认为这个选择实际上取决于你如何处理请求的结果。如果它总是要重定向,我只会在没有AJAX的情况下发出请求。如果正常情况下,您将返回放在页面上的HTML,那么JavaScriptResult可能会更好。如果您通常通过代码获取JSON并更新页面,那么我将发送一个包含URL的JSON响应,并让回调处理程序设置位置。