Конфликты имен действий маршрутизации ASP.Net MVC

StackOverflow https://stackoverflow.com/questions/808236

  •  03-07-2019
  •  | 
  •  

Вопрос

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

У нас есть представления наших исполнителей в папке (Views/Artists/..), ArtistsController, ArtistsRepository, и мы придерживаемся названий действий REST, таких как «Показать», «Новый», «Удалить» и т. д.

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

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

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

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

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

Спасибо

Это было полезно?

Решение

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

Другие советы

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

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 = "" }
);               
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top