2009-04-30 163 views
4

我們有一個網站,涉及藝術家和場地,我們正在開發ASP.net MVC。ASP.Net MVC路由動作名稱衝突

我們有一個文件夾中的藝術家的意見(查看/藝術家/ ..),一個ArtistsController,ArtistsRepository並堅持REST動作名稱,如顯示,新建,刪除等

當我們第一次嘲笑了我們的測試網址是/ artists/Show/1209 ,但我們需要更改此設置,以便網站顯示爲/ artists/Madonna和/ artists/Foo-Fighters等。

但是, ,我們如何區分有效的藝術家名稱和該控制器的動作名稱?例如,藝術家/ PostComment或藝術家/ DeleteComment?我需要允許路由來處理這個。我們的默認顯示路線是:解決此

routes.MapRoute(
       "ArtistDefault", 
       "artists/{artistName}", 
       new { controller = "Artists", action = "Show", artistName = ""} 

的方法之一是爲我們的網站在視覺上運行/藝術家,但有我們的控制器改名爲奇 - ArtistController - 而不是ArtistsController。這會違揹我們在開始時所使用的命名約定(但嘿!)。

您有任何其他建議嗎?如果可能的話,我們也可以根據動詞路由(所以PostComment將會是一個POST,所以我們也許可以轉到那個動作),但我不確定這是否可取,更不用說可能。

謝謝

回答

8

MapRoute的第4個參數允許您爲值指定限制。您可以在這個用於「artists/{action}/{id}」的路線之前添加一條路線,並對操作的有效值加以限制;如果未能匹配您的某個動作,它會轉到下一條匹配藝術家名稱的路線。

6

你實際上會定義多個路由......在你的控制器中定義的動作首先會在默認情況下位於最下面。我喜歡把路線定義看作是一個「大的」開關語句,「第一個規則滿足勝利。」

routes.MapRoute(
       "ArtistPostComment", 
       "artists/PostComment/{id}", 
       new { controller = "Artists", action = "PostComment", id = "" } 
); 
routes.MapRoute(
       "ArtistDeleteComment", 
       "artists/DeleteComment/{id}", 
       new { controller = "Artists", action = "DeleteComment", id = "" } 
); 
routes.MapRoute(
       "ArtistDefault", 
       "artists/{artistName}", 
       new { controller = "Artists", action = "Show", artistName = "" } 
);