2013-08-03 148 views
16

我想一個路由添加到默認的,所以我有兩個URL工作:ASP.NET MVC 4路 - 控制器/ ID VS控制器/操作/ ID

  1. http://www.mywebsite.com/users/create
  2. http://www.mywebsite.com/users/1

這將使得第一路線的工作:

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

然而,第二RO ute不會明顯工作。

這將使第二條路線的工作,但將打破第一個:

routes.MapRoute(
    name: "Book", 
    url: "books/{id}", 
    defaults: new { controller = "users", action = "Details" } 
); 

如何兩個路由配置結合,從而這兩個網址工作? 我很抱歉,如果已經有這樣的問題,我沒有找到任何東西。

+0

您的第二個網址是否應該包含「書籍」而不是「用戶」?您提到第二條路線使第二個網址工作,但打破了第一個網址,但第二個網址不適用於第二條路線,除非它匹配模式「books/{id}」。 – Triynko

回答

34

關鍵是要先放更具體的路線。所以先把「書」路線。 編輯我想你也需要一個約束,只允許數字匹配這條路線的「id」部分。 編輯完

routes.MapRoute(
    name: "Book", 
    url: "books/{id}", 
    defaults: new { controller = "users", action = "Details" }, 
    constraints: new { id = @"\d+" } 
); 

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

,並確保你的「詳細信息」動作「ID」參數是一個int:

// "users" controller 
public ActionResult books(int id) 
{ 
    // ... 
} 

這樣一來,「書」的路線不會趕上像一個網址/users/create(因爲第二個參數被要求爲一個數字),所以會進入下一個(「默認」)路線。

+0

是的,不,它不會像這樣跌倒。當你輸入/ users/create時,服務器需要一個{id}而不是「create」,並給出一個「Broken link」錯誤頁面。 –

+0

@ArmanBimatov我的錯。我生鏽了。我想你也需要在路線上有一個限制。我已經在上面更新了我的答案。 http://www.asp.net/mvc/tutorials/controllers-and-routing/creating-a-route-constraint-cs – McGarnagle

+0

不錯,它的工作原理。從不知道定義路由的限制。 –