我想捕获最新的未处理错误应用程序,并在发生错误时将其重定向到错误页面。但我收到错误“找不到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的匹配路由。”
答案 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 }
);