2008-08-27 122 views
10

我想忽略多個通配符路由。隨着asp.net的MVC預覽4,它們附帶:Asp.Net路由:如何忽略多個通配符路由?

RouteTable.Routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

我還想添加類似:

RouteTable.Routes.IgnoreRoute("Content/{*pathInfo}"); 

,但似乎打破一些,在生成URL傭工我程序。思考?

回答

13

這裏有兩個可能的解決方案。

  1. 向忽略路由添加一個約束,以確保只有被忽略的請求能夠匹配該路由。有點kludgy,但它應該工作。

    RouteTable.Routes.IgnoreRoute("{folder}/{*pathInfo}", new {folder="content"}); 
    
  2. 什麼是在您的內容目錄中?默認情況下,路由不會路由存在於磁盤上的文件(實際上會檢查VirtualPathProvider)。因此,如果您將靜態內容放入Content目錄中,則可能不需要忽略路由。

5

這可能是相當棘手。

當試圖弄清楚如何路由數據映射到一個路徑,系統直到找到一些地方提供所有所需的信息,然後充塞其他一切查詢參數搜索目前自上而下的。由於路線「Content/{* pathInfo}」的所需信息始終完全滿足(在此路線中根本不需要數據),並且它靠近路線列表的頂部,所以您嘗試映射到未命名的路線將匹配此模式,並且您的所有網址都將基於此(「Content?action = foo & controller = bar」)

不幸的是,行動路線無法解決此問題。如果使用命名路由(f.e.,選擇Html.RouteLink而不是Html.ActionLink),則可以指定要匹配的路由的名稱。它不太方便,但更精確。

IMO,複雜的路由使路由動作系統基本翻倒。在除默認路由之外的其他應用中,我幾乎總是最終恢復到基於命名路由的URL生成,以確保我始終獲得正確的路由。