Конфликты имен действий маршрутизации ASP.Net MVC - PullRequest
4 голосов
/ 30 апреля 2009

У нас есть веб-сайт, посвященный артистам и концертным площадкам, и мы разрабатываем его на ASP.net MVC.

У нас есть наши представления художников в папке (Views / Artists / ..), ArtistsController, ArtistsRepository и мы придерживаемся названий действий REST, таких как Show, New, Delete и т. Д.

Когда мы впервые создали макет сайта, в нашей тестовой среде все работало хорошо, так как наши тестовые URL были / Artist / Show / 1209 но нам нужно изменить это, чтобы веб-сайт отображался как / Artist / Madonna и / Artist / Foo-Fighters и т. д.

Однако, как мы можем различить действительные имена исполнителей и имена действий для этого контроллера ?! Например, исполнители / PostComment или художники / DeleteComment? Мне нужно, чтобы маршрутизация справилась с этим. Наш маршрут по умолчанию:

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

Одним из способов решения этой проблемы является то, что наш веб-сайт будет работать на / Artist, но наш контроллер будет переименован в единственное число - ArtistController - в отличие от ArtistsController. Это противоречило бы соглашениям об именах, которые мы использовали, когда начинали (но эй!).

У вас есть другие рекомендации? Если возможно, мы могли бы также маршрутизировать в зависимости от глаголов (поэтому PostComment был бы POST, чтобы мы могли, возможно, направить к этому действию), но я не уверен, что это целесообразно, не говоря уже о возможном.

Спасибо

Ответы [ 2 ]

8 голосов
/ 30 апреля 2009

4-й параметр в MapRoute позволяет указывать ограничения для значений. Вы можете добавить маршрут до этого, который предназначен для «художников / {действия} / {id}" с ограничением на допустимые значения для действия; не выполнив одно из ваших действий, он перейдет к следующему маршруту, который будет соответствовать имени исполнителя.

6 голосов
/ 01 мая 2009

Вы бы на самом деле определили несколько маршрутов ... определенные действия в вашем контроллере будут выполняться первыми, а значение по умолчанию будет внизу. Мне нравится думать об определениях маршрута как о «большой» инструкции переключения ole, где первое удовлетворенное правило побеждает ..

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 = "" }
);               
...