MVC扩展控制器以具有ajax感知的重定向功能

Tom*_*Tom 6 asp.net-mvc t4mvc

嗨,我正在学习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);
    }
}
Run Code Online (Sandbox Code Playgroud)

和......

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); }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

RedirectToRouteResult RedirectToAction(ActionResult结果)

还没有(非常方便,尤其是T4MVC).

由于我还是MVC的新手,我尝试过,但我不够了解自己如何写出来.你们中的任何一位专家可以帮助我吗?所以我可以从你的代码中学到它?非常感谢你.

小智 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 + "';"
                    };
                }
            }
        }
    
    Run Code Online (Sandbox Code Playgroud)
  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.");
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)