2013-03-21 121 views
2

我想達到改變我的應用程序的路線this目標看起來像這樣的路線時恢復到查詢字符串PARAMS:ActionLinks匹配不包含PARAM

hxxp://host/MyController/Widgets/3/AddWhatsit

這條路的觀點將有助於爲用戶添加的whatsit到Widget的3

同樣,我希望創建一個新的插件的路線是:

hxxp://host/MyController/Widgets/Create

我已經創建了單獨的路線來嘗試和促進這一點。它們是:

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

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

我遇到的問題是,當我瀏覽到該索引頁的小工具(/ myController的/小工具,匹配「DEFAULTACTION」路線),這將帶來一個新的URL參數設置的任何ActionLinks這不是該路線的一部分會變成查詢字符串值。所以,舉例來說,Widget 3的編輯鏈接將呈現爲: Widget/Edit?id=3 instead of (what I would prefer): Widget/3 /編輯

我想我明白我不會把我的(可選)id參數放在末尾路線。

我應該把它吸起來,並在路線的盡頭留下id?

回答

2

可以做到這一點。爲了獲得錨鏈接看起來像/主頁/ 1 /指數,設定路線,如:

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

    routes.MapRoute(
     name: "Custom", 
     url: "{controller}/{id}/{action}" 
     ); 

    routes.MapRoute(
     name: "Default", 
     url: "{controller}/{action}/{id}", 
     defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
    ); 
} 

,然後在視圖:

@Html.ActionLink("Here", "Index", "Home", new { id = 5 }, null) 

,你會得到呈現這樣的鏈接:

<a href="/Home/5/Index">Here</a> 

怪癖是限制自定義路線。在這種情況下,我刪除了默認值,他們沒有意義。當然,路線的順序。

+0

這讓我非常接近。一個副作用是,如果我在使用像「/ Widget/4/Whatsits」這樣的路徑進行查看並且想將動作鏈接返回到「Widget/Index」,我會得到類似於「Widget/4/Index」沒有必要。所以這會從「自定義」路線跳轉到「默認」。 – 2013-03-21 20:53:39

+1

它看起來像我的第二個問題是單獨的(環境路由值),所以我會關閉這一個。感謝您的回答。 – 2013-03-21 21:20:22

0

我相信你需要改變你的路線順序。請記住,MVC會查看路由列表並選取匹配路由的第一個。具有ID參數的第二條路由更具體,因此應該先放在路由表中。

即使您已在ActionLink中指定了ID參數,也已指定了控制器和操作。因此,第一個路由由RoutingEngine選擇。

最後,刪除ID屬性的可選參數。既然你希望在你有一個Id時選擇這條路線,那麼你不希望它成爲一個可選參數,你希望它被要求匹配那條路線。

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

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