3

global.asaxでresponse.redirecttorouteを使用してカスタムルートを使用したいのですが、機能していません。RouteConfigには次のものがあります。

routes.MapRoute(
            name: "Error",
            url: "Error/{action}/{excep}",
            defaults: new { action = "Index", excep = UrlParameter.Optional }
        );

そして、私のglobal.asaxで、私は次のことを行います。

Response.RedirectToRoute("Error", new { action="Index", excep=ex.Message });

私のErrorControllerには次のものがあります。

public ActionResult Index(string excep)
    {
        ViewBag.Exception = excep;

        return View();
    }

エラーのインデックスビューで、ViewBag.Exceptionを呼び出して例外を表示します。

私が使用するとき:

Response.Redirect("/Error/Index/0/"+ex.Message, true);

そして、これを私のコントローラーで使用します。

public ActionResult Index(int? id,string excep)
    {
        ViewBag.Exception = excep;

        return View();
    }

それは動作しますが、これはデフォルトルートであり、私が望むものではありません。リダイレクトでは機能するのにredirecttorouteでは機能しないのはなぜですか?

4

3 に答える 3

3

この他の質問にはかなり良い答えがあります: RedirectToRoute はどのように使用されることになっていますか?

Response.End()の後にを追加しRedirectToRouteて、それが機能するかどうかを確認します。

于 2013-01-31T16:16:23.217 に答える
3

私は同じ問題に直面しましたが、解決策を見つけました。多分あなたはこれを試すことができます:クラス名または変数名を必要に応じて名前変更してください。Global.asax から何かを変更した後は、ブラウザのキャッシュをクリアしてください。お役に立てれば。

Global.asax

  public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
       //Make sure this route is the first one to be added
        routes.MapRoute(
           "ErrorHandler",
           "ErrorHandler/{action}/{errMsg}",
           new { controller = "ErrorHandler", action = "Index", errMsg=UrlParameter.Optional}
           );
        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );

    }

unhandles 例外が発生すると、応答を Global.asax Application_Error イベントからエラー ハンドラーにリダイレクトします。

 protected void Application_Error(object sender, EventArgs e)
        {
            var errMsg = Server.GetLastError().Message;
            if (string.IsNullOrWhiteSpace(errMsg)) return;
            //Make sure parameter names to be passed is are not equal
            Response.RedirectToRoute("ErrorHandler", new { strErrMsg=errMsg });
            this.Context.ClearError();
        }

エラー ハンドラー コントローラー

public class ErrorHandlerController : Controller
    {

        public ActionResult Index(string strErrMsg)
        {
            ViewBag.Exception = strErrMsg;
            return View();
        }

    }

HomeController の Index ActionResult でエラー ハンドラーをテストするには、次のコードを追加します。

public class HomeController : Controller
    {
        public ActionResult Index()
        {
            //just intentionally add this code so that exception will occur
            int.Parse("test");
            return View();
        }
    }

出力は次のようになります。

ここに画像の説明を入力

于 2013-02-01T04:28:21.403 に答える
0

MVC 4を使用して問題を解決した方法は次のとおりです。

RouteConfig.cs

    routes.MapRoute(
            name: "ErrorHandler",
            url: "Login/Error/{code}",
            defaults: new { controller = "Login", action = "Error", code = 10000 } //default code is 10000
        );

    routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Login", action = "Index", id = UrlParameter.Optional }
        );

Global.asax.cs

    protected void Application_Start()
    {
            //previous code
            RouteConfig.RegisterRoutes(RouteTable.Routes);

            this.Error += Application_Error; //register the event
    } 

    public void Application_Error(object sender, EventArgs e)
    {
            Exception exception = Server.GetLastError();
            CustomException customException = (CustomException) exception;
            //your code here

            //here i have sure that the exception variable is an instance of CustomException.
            codeErr = customException.getErrorCode(); //acquire error code from custom exception

            Server.ClearError();

            Response.RedirectToRoute("ErrorHandler", new
                                    {
                                            code = codeErr
                                    });
            Response.End();
    }

ここに秘訣があります: Response.End() を Application_Error メソッドの最後に置くようにしてください。そうしないと、ルートへのリダイレクトが正しく機能しません。具体的には、コード パラメータはコントローラのアクション メソッドに渡されません。

ログインコントローラ

    public class LoginController : Controller
    {
           //make sure to name the parameter with the same name that you have passed as the route parameter on Response.RedirectToRoute method.
           public ActionResult Error(int code)
           {
                   ViewBag.ErrorCode = code;

                   ViewBag.ErrorMessage = EnumUtil.GetDescriptionFromEnumValue((Error)code);

                   return View();
           }
    }
于 2014-11-18T14:48:17.500 に答える