2009-04-29 71 views
0

我定義了很多顯式路由。其中之一是:默認和catchall路由問題

routes.MapRoute("default", "", 
    new { controller = "Home", action = "Index" }); 

最後,我定義了一個包羅萬象的路線:

routes.MapRoute("PageNotFound", "{*url}", 
    new { controller = "Error", action = "Http404" }); 

如果我去主頁http://localhost,然後將HTTP404顯示的頁面。奇怪的是,如果我刪除catchall路線,那麼歡迎頁面顯示正確。 請注意,我有一個菜單,我打電話Url.RouteUrl(「默認」),並正確地生成主頁的鏈接。

那麼,爲什麼我的默認路由在catchall路由存在時沒有激活?

更新:我使用的是routes.RouteExistingFiles = true。如果我刪除它,那麼它按預期工作。但我需要它被設置爲true。這裏有什麼問題?

謝謝。

回答

0

如果使用「routes.RouteExistingFiles = true」,這意味着它將路由現有的(物理存在的)文件 - 因此路由將跳過這些文件。我認爲在你的根網站上可能有一個「default.aspx」或「index.htm」或類似的東西。

打開RouteExistingFiles將允許正常執行這些文件(而不是通過路由)。

現在我想到的是,您的Catchall路由覆蓋了您的RouteExistingFiles - 因此它會自動將default.aspx路由到您的404 catchall。

0

如果您仍然有默認路由(即{控制器}/{行動}/{ID})中的RegisterRoutes(),它會匹配陷阱正常的MVC請求的格式的所有網址。

換句話說,包羅萬象的路線只能攔截不良URL,如果它不符合正常的格式(等等/等等/等等/等等)。

對於不存在的控制器,必須通過傳統的ASP.NET處理來處理異常。

即使世界處理這個here

0

你嘗試把一個約束的包羅萬象的路線很好的說明?約束條件應該告訴它,catch-all段不應該有0個字符。