2010-02-26 85 views
8

我最近看到的一個主要障礙是讓我頭腦中圍繞着我開發的一些基於MVC的應用程序的一些更復雜的路由需求。 我遇到問題,找到合適的教程組來引導我完成理解。高級ASP路由教程和示例

我想找到的是一套完整的從基本(控制器/動作/ ID)到高級路由的教程。

什麼我打電話高級路由的一個例子是一樣的東西:

/blog/year/month/day/title - 將映射到控制器:blog和行動:post和參數:yearmonthdaytitle

/blog/title - 將映射到控制器:blog和動作:post並作爲參數:title

/title - 將映射到控制器:blog和行動:post和參數:title

我可以映射每個可能設置爲使用一個數據庫在全球的顯式路由,但好像它打敗具有路由引擎的點路由到正確的地方。我寧願定義一次規則。

回答

15

我不明白,爲什麼你不能把它們中的每一個定義爲一個單獨的路徑,在需要時使用正則表達式。例如區分/blog/year/month/day/title/blog/title

這些集合中的每一個都是一個單獨的案例,您需要告訴MVC如何處理每個集合。

對於第一種情況:/blog/year/month/day/title

routes.MapRoute(
    "Blog Full Route", // Route name 
    "blog/{year}/{month}/{day}/{title}", // URL with parameters 
    new {controller = "blog", action = "post"}, // Defaults 
    new {year = @"\d+", month= @"\d+", day = @"\d+"} // Constrain parameters with RegEx patterns 
    ); 

對於第二種情況:/blog/title

routes.MapRoute(
    "Blog Title Route", // Route name 
    "blog/{title}", // URL with parameters 
    new {controller = "blog", action = "post"}, // Defaults 
    ); 

對於最後一種情況:/title

routes.MapRoute(
    "Title Route", // Route name 
    "{title}", // URL with parameters 
    new {controller = "blog", action = "post"}, // Defaults 
    ); 
您可以通過 defining the rule onceGlobal.asax.cs文件做到這一點

訣竅是把這些路線按照這個確切的順序排列,最不具體的在最下面。改變順序會導致錯誤的路由(特別是在最後兩個路由中)。如果最後一個案例與第二個案例切換,則類型爲blog/SomeTitle的URLS將以blog作爲標題路由到post動作。

每當你創造的東西的路線,請記住以下幾點:

  1. 約束路由參數與正則表達式
  2. very知道路線順序(哪條路線來之前這)
  3. 該花括號{something}分別表示動作參數

一些很好的教程:

+0

很好的解釋和鏈接,謝謝。 – Kieron 2010-02-26 15:03:57

+0

夢幻般的答案。 – 2015-02-23 23:46:44