4

アーティストや会場を扱う Web サイトがあり、ASP.net MVC で開発しています。

フォルダー (Views/Artists/..)、ArtistsController、ArtistsRepository にアーティスト ビューがあり、Show、New、Delete などの REST アクション名に従います。

最初にサイトをモックアップしたとき、テスト URL は /artists/Show/1209 だったので、すべてがテスト環境でうまく機能しましたが、これを変更して、Web サイトが /artists/Madonna や /artists/Foo-Fighters などのように表示されるようにする必要があります。

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

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

これを回避する方法の 1 つは、Web サイトを /artists で目に見えるように実行することですが、コントローラーの名前を ArtistsController ではなく単一の ArtistController に変更します。それは、私たちが始めたときに使用した命名規則に反することになります (しかしねえ!)。

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

ありがとう

4

2 に答える 2

8

MapRoute の 4 番目のパラメーターを使用すると、値の制限を指定できます。このルートの前に、「artists/{action}/{id}」用のルートを追加できますが、action の有効な値に制限があります。アクションのいずれかに一致しない場合、アーティスト名に一致する次のルートにフォールスルーします。

于 2009-04-30T18:37:06.147 に答える
6

実際には複数のルートを定義します...コントローラーで定義されたアクションが最初に実行され、デフォルトが一番下になります。私は、ルート定義を、最初のルールが満たされる「大きな'oleswitchステートメント」と考えるのが好きです。

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 = "" }
);               
于 2009-04-30T22:56:56.240 に答える