2011-01-28 113 views
6

我知道如何設置自己的路由,但是如何處理路由表中的路由?我的意思是,我想默認的{controller}/{action}/{id}路線可能是一個通用的方式,但我不確定是否要走。我喜歡讓我的用戶知道他們已經請求了不存在的數據/頁面。處理ASP.NET MVC中的路由錯誤

這是[HandleError]過濾器進來的地方嗎?這是如何工作的?

回答

7

如果找不到您的路線,您希望將其作爲正常的HTTP 404錯誤處理。

如果您只將[HandleError]屬性添加到您的課程或操作中,MVC將在您的視圖文件夾中查找Error視圖。

你也可以添加一個ErrorController甚至一個靜態頁面,並添加到您的Web.config

<customErrors mode="On" > 
    <error statusCode="404" redirect="/Error/PageNotFound/" /> 
</customErrors> 

或者你也可以處理HTTP 404在您的Global.asax.cs和路由到ErrorController編程。那怎麼我一般做:

protected void Application_Error(object sender, EventArgs e) 
{ 
    var ex = Server.GetLastError().GetBaseException(); 

    var routeData = new RouteData(); 

    if (ex.GetType() == typeof(HttpException)) 
    { 
     var httpException = (HttpException)ex; 

     switch (httpException.GetHttpCode()) 
     { 
      case 404: 
       routeData.Values.Add("action", "PageNotFound"); 
       break; 
      default: 
       routeData.Values.Add("action", "GeneralError"); 
       break; 
     } 
    } 
    else 
    { 
     routeData.Values.Add("action", "GeneralError"); 
    } 

    routeData.Values.Add("controller", "Error"); 
    routeData.Values.Add("error", ex); 

    IController errorController = new ErrorController(); 
    errorController.Execute(new RequestContext(new HttpContextWrapper(Context), routeData)); 
} 
4

可以定義這樣的路線:

routes.MapRoute(
       "PageNotFound", 
       "{*catchall}", 
       new { controller = "Home", action = "PageNotFound" } 
       ); 

比使控制器這樣一個動作:

 public ActionResult PageNotFound() 
     { 
      ViewBag.Message = "Sorry, the page you requested does not exist."; 
      return View(); 
     } 

這條航線前人的精力在最後補充道,這樣它會抓住任何要求無法映射。

HandleError屬性用於捕獲可能發生在控制器操作中的異常。

+0

問題這種方法是..如果你試圖使孩子動作@ Html.Action(routeValues)與錯誤的價值觀,它會使`PageNotFound`行動`PartialView`沒有實際報告任何異常。 – Nenad 2013-10-11 14:25:14