2012-09-10 143 views
1

我正在使用MVC 4.0,我試圖爲每個控制器添加一個路由。MVC路由多個控制器

那麼,我的第一個控制器被稱爲CustomersController。補充說,我已經 的路線是:

routes.MapRoute(
     name: "Customer", 
     url: "{controller}/{action}/{IdCustomer}", 
     defaults: new { controller = "Customers", action = "Index", IdCustomer = UrlParameter.Optional } 
    ); 

當我運行的應用程序,我得到的索引頁以下鏈接(列表):

http://localhost:6838/Customers/Create/5 
http://localhost:6838/Customers/Edit/5 
http://localhost:6838/Customers/Details/5 
http://localhost:6838/Customers/Delete/5 

好,太好了!這是我正在尋找的,但現在開始我的問題。我又增加了 控制器,叫做上述ItemsController(有相同的動作 - 創建/編輯/細節/刪除),然後我試圖添加相同的路線:

routes.MapRoute(
     name: "Item", 
     url: "{controller}/{action}/{IdItem}", 
     defaults: new { controller = "Items", action = "Index", IdItem = UrlParameter.Optional } 
    ); 

但現在的結果是不同的...我得到以下鏈接:

http://localhost:6838/Items/Create?IdItem=1 
    http://localhost:6838/Items/Edit?IdItem=1 
    http://localhost:6838/Items/Detail?IdItem=1 
    http://localhost:6838/Items/Delete?IdItem=1 

爲什麼。爲什麼?「(這是行不通的,爲什麼它是新的一個工作僅第一路由,而不是 只是增加?

最好的問候, 丹

+1

您的路線過於通用。爲什麼當這些操作針對客戶和項目(根據ID的名稱)時,仍然在使用「{controller}」?您應該使用「Customers/{action}/{IdCustomer}」或「Items/{action}/{IdItem}'。請記住,URL生成是一個順序測試。分析器發現它將使用的第一個匹配URL(因此在這種情況下使用客戶網址)。 –

+0

這是我第一次使用路線..我以前從未使用過它。理解你的意思很複雜。 – Dan

+0

現在我明白了......謝謝@BradChristie – Dan

回答

2

要給出我的答案大綱,你的路線太模糊。你需要更具體地獲得更好的結果(特別是如果你不使用名稱路由)。我會去像下面這樣:

routes.MapRoute(
    name: "Customers", 
    url: "Customers", 
    defaults: new { controller = "Customers", action = "Index" } 
); 
routes.MapRoute(
    name: "CustomerDetails", 
    url: "Customer/{IdCustomer}", 
    defaults: new { controller = "Customers", action = "Details", IdItem = UrlParameter.Optional } 
); 
routes.MapRoute(
    name: "CustomerEdit", 
    url: "Customer/{IdCustomer}", 
    defaults: new { controller = "Customers", action = "Edit", IdItem = UrlParameter.Optional } 
); 
/* and so on (then move on to Items) */ 

現在,您可以通過名稱來引用他們,同時也消除了很多你通常提供(如動作和控制器的詳細信息)的初步信息。它還使更新鏈接變得更容易,因爲路由被命名,而不是明確的控制器/操作。

@Html.RouteLink("Edit Customer", "CustomerEdit", new { IdCustomer = model.Id }); 

現在,您可以在不同的地區提出這樣或具有其他控制器通過改變你的路線定義,所有的RouteLinks可保持不變,後處理。