6

嗨,我正在学习 Ajax + MVC。我认为控制器自动处理 ajax 感知 Redirect() 会很好。经过一番挖掘,我从这个链接中找到了代码。下面的代码对用户完全透明,用户只需调用 Redirect(someUrlString) 而无需担心普通/ajax 调用之间的差异。使它非常整洁和凉爽。

public abstract class BaseController : System.Web.Mvc.Controller {
    //turn into ajax aware redirect
    protected override RedirectResult Redirect(string url) {
        return new AjaxAwareRedirectResult(url);
    }
}

和 ...

public class AjaxAwareRedirectResult : RedirectResult {
    public AjaxAwareRedirectResult(string url) : base(url) { }
    public override void ExecuteResult(ControllerContext context) {
        if (context.RequestContext.HttpContext.Request.IsAjaxRequest()) {
            string desturl = UrlHelper.GenerateContentUrl(Url, context.HttpContext);
            JavaScriptResult result = new JavaScriptResult() { 
                                      Script = "window.location='" + desturl + "';" };
            result.ExecuteResult(context);
        }
        else { base.ExecuteResult(context); }
    }
}

但是,它并不完整。挑战是:

RedirectToRouteResult RedirectToAction ( ActionResult结果)

还没有(非常方便,尤其是对于 T4MVC)。

由于我还是 MVC 的新手,所以我尝试过,但我的知识不够丰富,无法充分弄清楚如何自己编写这个。请问有哪位专家可以帮我解决这个问题吗?所以我可以从你的代码中学习它?非常感谢。

4

2 回答 2

7

这是我在项目中用于 Ajax 感知重定向的快速简单解决方案。

  1. 为操作创建一个类 AjaxRedirectAttribute。

        public class AjaxRedirectAttribute : ActionFilterAttribute
        {
            public override void OnActionExecuted(ActionExecutedContext filterContext)
            {
                var result = filterContext.Result as RedirectResult;
                if (result != null && filterContext.HttpContext.Request.IsAjaxRequest())
                {
                    string destinationUrl = UrlHelper.GenerateContentUrl(result.Url, filterContext.HttpContext);
                    filterContext.Result = new JavaScriptResult()
                    {
                        Script = "window.location = '" + destinationUrl + "';"
                    };
                }
            }
        }
    
  2. 如下使用此属性以重定向到其他页面或从操作返回一些结果。

    [AjaxRedirect]
    public ActionResult MyAction(FormCollection frmcol)
    {
        // some code here
        if (UserId != 0)
        {
            return Redirect(this.Url.Action("Action", "Controller"));
        }
        else
        {
            return Content("Error message here.");
        }
    }
    
于 2012-06-25T10:58:16.810 回答
0

这是一个很好的解决方案,适用于 Ajax(Ajax.BeginForm 或 jquery.ajax)调用的 MVC 异常处理。

因此,如您所知,global.asax.cs 文件中有一个 Application_Error。你能告诉我如何在这里处理“JavaScriptResult”结果的ajax调用吗?

我正在使用“RedirectToRoute”来处理它,但在某些代码中,它会在 html 中附加现有的标头。我的错误控制器没有布局(_Layout=null),但它仍然显示页眉和页脚。

我正在处理一个新的 RedirectToRoute 调用。

 Response.RedirectToRoute("Default", new {controller = "Error", action = "Error"});



protected void Application_Error(object sender, EventArgs e)
        {
            RouteValueDictionary routeDataCollection = HttpContext.Current.Request.RequestContext.RouteData.Values;
            if (null != routeDataCollection && routeDataCollection.Count()>1)
            {
                Server.ClearError();
                 Response.RedirectToRoute("Default", new { controller = "Error", action = "Error"});
             }
        }

谢谢

萨加尔

于 2015-04-29T06:50:01.353 回答