2009-04-30 22 views
4

私たちは、アーティストや会場を扱うWebサイトを持っており、ASP.net MVCで開発しています。ASP.Net MVCルーティングアクションの名前の競合

私たちは、など私たちのアーティストフォルダ内のビュー(ビュー/アーティスト/ ..)、ArtistsController、ArtistsRepositoryを持っていると、このようなショー、NewなどRESTのアクション名に準拠し、削除

我々は最初に嘲笑するときテストのURLが/ artists/Show/1209 のようにテスト環境でうまくいきましたが、ウェブサイトが/ artist/Madonna、/ artists/Foo-Fightersなどのように見えるように変更する必要があります。

有効なアーティスト名とそのコントローラのアクション名を区別するにはどうすればいいですか?例えば、アーティスト/ PostCommentやアーティスト/ DeleteComment?私はルーティングがこれを処理できるようにする必要があります。私たちのデフォルトの表示ルートは次のとおりです。この周り

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

一つの方法は、目に見えて/アーティスト上で実行するために私たちのウェブサイトのためですが、私たちのコントローラは、単数形に名前を変更した - ArtistController - ArtistsControllerとは対照的です。それは私達が始めたときに行った命名規則に反するでしょう(しかしちょっと!)。

その他のおすすめはありますか?可能であれば、動詞に応じてルーティングすることもできます(PostCommentはPOSTなので、おそらくそのアクションにルーティングすることができます)。しかし、それが可能かどうかはわかりません。 MapRouteへ

おかげ

答えて

8

4番目のパラメータを使用すると、値に対する制限を指定することができます。アクションの有効な値に制限がある「artist/{action}/{id}」のルートを追加することができます。あなたの行動の1つに合致しない場合、それはアーティスト名に一致する次のルートに落ちます。

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 = "" } 
);    
関連する問題