2011-11-04 62 views
4

我期待符合這些模式設置路線:如何設置複雜的路由在asp.net MVC

/users 
Mapped to action GetAllUsers() 

/users/12345 
Mapped to action GetUser(int id) 

/users/1235/favorites 
mapped to action GetUserFavorites(int id) 

控制器應始終是UsersController。我認爲這會起作用,但事實並非如此。

routes.MapRoute("1", 
       "{controller}/{action}/{id}", 
       new { id = UrlParameter.Optional, action = "index" }); 

routes.MapRoute("2", 
       "{controller}/{id}/{action}"); 

我正在努力把頭圍住它。任何幫助將非常感激。

+2

[使用路由調試器!](http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx) – bzlm

+0

+1 for @bzlm - 我沒有意識到該工具 - 謝謝 – iandotkelly

回答

10

爲了實現你的目標,你需要三個獨立的路線在的global.asax.cs RegisterRoutes,應該按以下順序進行添加,且必須是Default路線之前(假定ID必須爲整數) :

routes.MapRoute(
    "GetUserFavorites", // Route name 
    "users/{id}/favorites", // URL with parameters 
    new { controller = "Users", action = "GetUserFavorites" }, // Parameter defaults 
    new { id = @"\d+" } // Route constraint 
); 

routes.MapRoute(
    "GetUser", // Route name 
    "users/{id}", // URL with parameters 
    new { controller = "Users", action = "GetUser" } // Parameter defaults 
    new { id = @"\d+" } // Route constraint 
); 

routes.MapRoute(
    "GetAllUsers", // Route name 
    "users", // URL with parameters 
    new { controller = "Users", action = "GetAllUsers" } // Parameter defaults 
); 
+0

所以沒有通用的方式來設置它,以便我不必硬編碼操作或控制器名稱? – Micah

+0

鑑於您列出的要求,路由必須非常具體。但是,如果您的控制器具有一致的URL命名方案和一致的操作名稱,則可以制定規則以服務於多個控制器,而不僅僅是您的用戶控制器。 – counsellorben

+0

@Micah - 是的,但不是您在問題中指出的從URL到Action的映射。我增加了這個到我的答案,因爲有更多的空間。 – iandotkelly

3

counsellorben在我做之前就得到了答案。如果你想要那些確切的URL和那些確切的方法,那麼這是唯一的方法。您可以通過將GetUser和GetAllUsers組合成一個具有可爲空的id的動作來減少路由的數量,例如,

routes.MapRoute(
    "GetUser", 
    "users/{id}", 
    new { controller = "Users", action = "GetUser", id = UrlParameter.Optional} 
    new { id = @"\d+" } // Route constraint 
); 

如果你想使用URL設置控制器和動作自動調用你會需要像

routes.MapRoute(
     "GetUser", 
     "{controller}/{action}/{id}", 
     new { id = UrlParameter.Optional} 
     new { id = @"\d+" } // Route constraint 
    ); 

這將調用一個方法GetUser(int? id)

但這需要你更改你想要的網址/users/getuser/1234將去GetUser(int id)/users/getallusers將去GetAllUsers()。這是未經測試的方式 - 可能會有一些輕微的錯誤。