2014-05-19 94 views
0

我有一個系統爲一個頁面生成一個「地址」,用作路由中的一個段。它可以包含一個層次路徑:ASP.NET MVC路由:如何覆蓋路由匹配

解決方案/軟件/列表

我要地圖的是這樣的路線:

routes.MapRoute(
    "Default", 
    "{address}/{action}", 
    new { controller = "Home", 
     action = UrlParameter.Optional 
    } //defaults 
); 

地址可以包含像「解決方案/軟件」的階層路徑。列表是這種情況下的操作名稱。從地址段中,我們可以找到正確的控制器和操作。其他例子是「解決方案/軟件/我的CRM系統」。

從我能理解的情況來看,如果{address}包含「/」,MVC將不匹配任何路由。是否有可能重寫路線匹配,所以我可以得到這個工作?

我知道我可以用一個貪婪的包羅萬象的實現大部分的我想要什麼,但我想獲得一個版本,而包羅萬象的工作:http://erraticdev.blogspot.no/2011/01/custom-aspnet-mvc-route-class-with.html

+0

那你哪個錯誤?如果你想包含地址:它應該像這個''地址/ {動作}「',除此之外你可以擁有其他路線? –

+0

找不到匹配的路由,因爲只有{address}的內容的第一部分連接到{address},如果{address}包含/。 –

+0

你可以展示整個班級嗎?因爲它取決於你放在'RouteTable'上的順序。 –

回答

0

你想設置包含幾個路線可選部分。例如,在此路線中,Solutions/Software/My-CRM-System,解決方案/軟件是可選的,它們是您地址部分的一部分。幾個月前我有類似的問題,我找到了解決辦法。你可以找到它的細節here。使用該方法,您可以創建如下路線:

routes.MapRoute(
      name: "Test", 
      url: "Test/{Country}/{Maker}/{Type}", 
      defaults: new { controller = "Test", action = "Index", Country = UrlParameter.Optional, Maker = UrlParameter.Optional, Type = UrlParameter.Optional }, 
      lookupParameters: new string[] { "Country", "Maker", "Type" }, 
      routeValueService: new RouteValueService()); 

當然,您需要實現IRouteValueLookupService接口的自定義版本。

+0

感謝您的回覆!我認爲這不適合我。它解決了路由的一個常見問題,但我的問題是其中一個url段包含多個子段。我無法找到一種方式來「告訴」路由引擎將子段作爲主段的一部分(在我的示例中稱爲{address})。 –

0

假設您的地址最多有4個部分。你可以這樣定義你的路由:

routes.MapRoute(
      name: "Test", 
      url: "{AddressPart1}/{AddressPart2}/{AddressPart3}/{AddressPart4}/{action}", 
      defaults: new { controller = "Home", action = "Index", AddressPart1 = UrlParameter.Optional, AddressPart2 = UrlParameter.Optional, AddressPart3 = UrlParameter.Optional, AddressPart4 = UrlParameter.Optional}, 
      lookupParameters: new string[] { "AddressPart1", "AddressPart2", "AddressPart3", "AddressPart4" }, 
      lookupService: new LookupService()); 

在lookupService中,你必須指定哪個值屬於哪個AddressPart。

在您的代碼中,您可以訪問AddressParts *的RouteData字典並將它們合併以重新構建您的地址字段。