Конфликты имен действий маршрутизации ASP.Net MVC
-
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 = "" }
);