6

こんにちは私はAjax+MVCを学んでいます。コントローラーがajax対応のRedirect()を自動的に処理するのがいいと思いました。少し掘り下げた後、私はこのリンクからコードを見つけました。以下のコードはユーザーに対して完全に透過的です。ユーザーは通常の呼び出しとajax呼び出しの違いを気にすることなく、Redirect(someUrlString)を呼び出すことができます。とてもすっきりとクールになります。

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 RedirectToActionActionResult結果)

まだありません(特に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 に答える