2012-01-04 107 views
5

當我使用Html.ActionLink()創建的URL不是以期望的格式:MVC路由Html.ActionLink與創建網址ID = 1而不是/ ID

Html.ActionLink(Model.ProductCode, "Update", new { id = Model.ProductId }) 

使此URL

/Update?id=1 

當我想有這樣的URL:

/Update/1 

什麼路由選項創建第二個網址是什麼?這是我們的首選網址樣式。

兩個網址的工作,並顯示正確的頁面 - 但我們希望只使用/ ID

在Global.asax中的MVC的默認路由可以同時處理的URL

routes.MapRoute(
    "Default",            // Route name 
    "{controller}/{action}/{id}",       // URL with parameters 
    new { controller = "Home", action = "Index", id = "" }); // Parameter defaults 
+0

你有一條路線可以匹配嗎? – SLaks 2012-01-04 02:41:22

+0

你可以在global.asax中發佈路由嗎? – epignosisx 2012-01-04 02:41:22

+0

這兩條路線目前都有效。我只希望ActionLink以我們喜歡的格式生成URL。 – 2012-01-04 02:44:28

回答

3

我可以複製的問題有一條關於我的默認路線的路線,它仍然符合一般模式。例如:

routes.MapRoute(
          "Default2", // Route name 
          "{controller}/{action}", // URL with parameters 
          new { controller = "Home", action = "Index"} // Parameter defaults 
         ); 

當我在默認路由上方時,我在我的URL中獲得了?id = 1。您能否確認此ActionLink與您期望的路線上方的路線不匹配?

編輯:下面不影響URL

但是,它仍然可能是有利的是使用UrlParameter.Optional在其他方案。除非暴民規則另有說明,否則就會走向繁榮。

new UrlParameter.Optional value。如果將 URL參數的默認值設置爲此特殊值,則MVC會確保從路由值字典中刪除該密鑰 ,以使其不存在。

我認爲你需要稍微調整你的路線。更改ID =「」爲ID​​ = UrlParameter.Optional

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

這就是我們使用的默認路由,並且你正在尋找的行爲是我們的應用程序的行爲。

+0

URL仍然以?id = 1 – 2012-01-04 03:01:40

+0

JK結束 - 我剛剛驗證了自己,看看我是否可以讓我的MVC應用程序創建一個?使用URL。 MVC可以匹配到默認路由上方的其他路由嗎?是否有可能看到你的整個路線表? – Tommy 2012-01-04 03:04:55

0

請參閱This question/answer

您正在使用哪個版本的MVC?如果您使用的是MVC3,則需要在致電Html.ActionLink()時添加第四個參數,並傳入null

0

我剛剛偶然發現並決定回答。事實證明,Url.Action()和Html.ActionLink()都使用路由集合中的第一個路由來格式化結果URL。因此,在的RegisterRoutes第一映射路線()shoild是:

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

代替 「{控制器}/{行動} /(編號)」。路線名稱(即「默認」)無關緊要,只有訂單確實重要

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