2008-11-25 75 views
14

我似乎無法弄清楚這一點。我正在嘗試使用MVC Beta,並試圖實現一個catchall路由,以便如果用戶輸入mysite.com/blah而不是mysite.com/home/index,它將會出現「錯誤」路由。.Net MVC路由Catchall不工作

不幸的是,似乎「默認」路線總是首先捕獲「等等」。事實上,我已經能夠到達「錯誤」路線的唯一路線是blah/blah/blah/blah。

這是它應該工作的方式,因爲我已經看到其他的例子有這樣設置的「默認」和「錯誤」路由,似乎如果他們鍵入一個控制器不會不存在它會觸及「錯誤」路線。

有什麼我失蹤(很可能),或者我只需要爲每個控制器創建一個特定的路線?我使用

代碼:

 routes.MapRoute(
      "Default",            // Route name 
      "{controller}/{action}/{id}",       // URL with parameters 
      new { controller = "Home", action = "Index", id = "" } // Parameter defaults 
     ); 

     routes.MapRoute(
      "Error", 
      "{*catchall}", 
      new { controller = "Base", action = "Error", id = "404" } 
     ); 

謝謝 傑夫

回答

2

MVC路線,它們的輸入順序檢查。

Mysite/blah將被默認路由找到。控制器將是無用的,而動作是索引。

當你進入mysite/blah/blah/blah/blah路線時,你給它一條路線,它不能將默認路線映射到,然後調用你的catchall路線。

對於那些其他的例子,你注意到他們是否有一些錯誤過濾器設置?我很確定默認的asp.net mvc站點已經在頁面上有一些錯誤處理屬性。

+0

謝謝,這是我所瞭解的理解,但只是不想接受根據我所看到的和我所期望的。但我會學會處理它。 – 2008-11-25 23:07:05

5

爲了處理錯誤,我使用Application_Error事件在我的項目之一:

protected void Application_Error(object sender, EventArgs e) 
{ 
    Exception exception = Server.GetLastError(); 
    HttpException httpException = exception as HttpException; 
    if (httpException != null) 
    { 
     RouteData routeData = new RouteData(); 
     routeData.Values.Add("controller", "Error"); 
     routeData.Values.Add("action", "HttpError500"); 

      if (httpException.GetHttpCode() == 404) 
      { 
       routeData.Values["action"] = "HttpError404"; 
      } 

     Server.ClearError(); 
     Response.Clear(); 
     IController errorController = new ErrorController(); 
     errorController.Execute(new RequestContext(new HttpContextWrapper(Context), routeData)); 
    } 
} 
+0

這是做異常處理的錯誤地方,而且你也通過吹除異常來改變異常的含義。這可能會使調試非常非常困難。 – 2009-05-27 05:21:46

+1

我不明白爲什麼使用Application_Error處理程序會使調試變得困難。如果您記錄異常,您將擁有完整的堆棧跟蹤。 * catchall路由的另一個問題是,如果控制器操作發生異常,它將不會被調用,所以如果你想處理500個錯誤,你需要在其他地方執行。我更喜歡在一個地方有所有的異常處理代碼。 – 2009-05-27 07:05:14

+0

最大的問題是,在錯誤進入Application_Error時(例如會話對象),您會損失大量上下文,並且如果不考慮這些事情,那麼調試將變成一場噩夢。 – 2010-10-02 00:33:34

6

你的第一條路線會趕上最網址,因爲你必須爲元素的默認值,你可以在此使用路由可視化從菲爾哈克調試器,看到鏈接:

Route Debugger

0

與MVC包羅萬象的問題時,這也可以幫助:

routes.MapRoute(
    "Default",            // Route name 
    "{controller}/{action}/{*id}",       // URL with parameters 
    new { controller = "Home", action = "Index", id = "" } // Parameter defaults 
); 

也就是說,它表示{id},將其更改爲{*id}。這允許可能被傳入最後id參數消耗盡可能多的附加路徑默認規則接受這一點:

/人/姓名/喬

但不是這樣的:

/產品/列表/ sortby /名稱

第二個URL將拋出一個404,但沒有對路由進行此修改。