MVC路由错误处理程序

时间:2013-02-01 02:13:27

标签: c# asp.net-mvc asp.net-mvc-3 asp.net-mvc-routing

我想捕获最新的未处理错误应用程序,并在发生错误时将其重定向到错误页面。但我收到错误“找不到RedirectToRoute的匹配路由。”我的代码有什么问题?这是我的实施:

Global.asax中

routes.MapRoute(
        "ErrorHandler",
        "{ErrorHandler}/{action}/{errMsg}",
       new {controller="ErrorHandler", action = "Index", errMsg = UrlParameter.Optional }
       );

Application_End

 protected void Application_Error(object sender, EventArgs e)
        {
            var strError = Server.GetLastError().Message;
            if (string.IsNullOrWhiteSpace(strError)) return;
            Response.RedirectToRoute("ErrorHandler", new {controller="ErrorHandler", action = "Index", errMsg = strError });
            this.Context.ClearError();
        }

ErrorHandler控制器

public class ErrorHandlerController : Controller
    {

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

    }

在我的家庭控制器上测试错误处理程序

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

更新

拼写错误“contoller”。感谢drch。但我仍然收到错误“找不到RedirectToRoute的匹配路由。”

1 个答案:

答案 0 :(得分:4)

路线定义一定存在问题。

您拥有的路线:

routes.MapRoute(
    "ErrorHandler",
    "{ErrorHandler}/{action}/{errMsg}",
   new {controller="ErrorHandler", action = "Index", errMsg = UrlParameter.Optional }
   );

非常渴望并会引发问题。这将匹配任何http://yoursite/anything/anything/*的网址。因为你的HomeController.Index甚至被执行了,这意味着路由已经与更贪婪的路由匹配(可能是默认路由?)。

所以有两件事 -

1)您需要将错误处理程序路由向上移动。 MVC使用它在路由表中找到的第一个匹配路由。

2)让你的路线不那么贪心,即:

routes.MapRoute(
    "ErrorHandler",
    "ErrorHandler/{action}/{errMsg}",
   new {controller="ErrorHandler", action = "Index", errMsg = UrlParameter.Optional }
   );