2013-02-01 149 views
0

我想捕獲最新的未處理的錯誤應用程序,並在發生錯誤時將其重定向到錯誤頁面。但是我得到錯誤「找不到匹配的RedirectToRoute路由」。我的代碼有什麼問題?下面是我實現的:MVC路由錯誤處理程序

的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(); 
     } 
    } 

更新

錯字 「位指示」。感謝drch。但仍然出現錯誤「找不到與RedirectToRoute匹配的路由」。

+0

只是胡亂猜測,但你嘗試命名路線不同的東西,即ErrorHandlerRoute? – dreza

+0

@dreza。我最近嘗試了你的建議,不幸的是我仍然得到了「找不到與RedirectToRoute匹配的路線」。 –

回答

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 } 
    ); 
+0

感謝哥們!現在錯誤消失了!但還有另一個問題。我有另一個問題說「資源無法找到」。我注意到重定向的URL如下所示:「/ ErrorHandler/Index/Input%20Blah blah blah」。它應該是「/的ErrorHandler?ERRMSG =等等等等等等」 –

+0

我_think_,如果您刪除「{ERRMSG}」,所以它只是「的ErrorHandler/{行動}」的消息最終會爲?ERRMSG =等等 – drch

+0

不,我沒」 t取出它仍然是相同的ERRMSG「的ErrorHandler/{行動}/{} ERRMSG」 –