Asp.mvc маршруты без деталей действия
-
18-09-2019 - |
Вопрос
Я хотел бы иметь URL, которые даже короче/{Controller}/{Action}/{id}.
Например, я бы хотел {controller}/{id}, где {id} - это строка.
Это позволило бы проложить простые пути, например, пользователи/имя пользователя, страницы/pagename, News/Newsname. Мне это нравится больше, чем требует/деталей в URL-адресе (пользователи/детали/имя пользователя), которое менее элегантно для конечного пользователя.
Я могу легко сделать эту работу, настроив пользовательские маршруты для любого контроллера, для которого я хочу этот уровень простоты. Однако это вызывает головные боли, когда речь идет о реализации других действий, таких как {Controller}/{action}, где {action} = 'create' ', поскольку в данном случае строка {action} конфликтует со строкой {id}.
Мой вопрос: как я могу «зарезервировать» слова, так что если URL-адрес является /News /Create, он рассматривается как действие, но если URL-что-то еще, например, News /A-Gorilla-ate-my- Тезис, тогда он рассматривается как идентификатор.
Я надеюсь, что смогу определить это при настройке своих маршрутов?
Обновлять:
Используя ответ Бена Грисволда, я обновил маршруты ASP.NET MVC, чтобы быть:
routes.MapRoute(
"CreateRoute", // route name
"{controller}/Create", // url with parameters
new { action = "Create" } // parameter defaults
);
routes.MapRoute(
"DetailsRoute", // route name
"{controller}/{id}", // url with parameters
new { action = "Details" } // parameter defaults
);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = "" } // Parameter defaults
);
Это работает за обаяние и по умолчанию, страницы деталей будут использовать упрощенный URL -адрес, но я все равно смогу нацелиться на конкретное действие, если захочу (обновление/удаление/детали).
Конечно, вам нужно будет запретить зарезервированное слово «создавать» как идентификатор, иначе пользователь может попытаться создать статью, например, с именем «Создание», к которому никогда не можно получить доступ.
Это действительно хорошо. Если кто -то видит, что что -то не так с этим подходом, взволнован, но мне это нравится.
Решение
Я думаю, что у вас остается создание маршрута для каждого зарезервированного слова. Например,
routes.MapRoute("CreateRoute",
"{controller}/Create",
new { action = "Create" }
);
Обработал бы /news /create, /users /create и т. Д. Пока этот маршрут перечислен до вашего другого пользовательского маршрута, я думаю, что вы покрывают.
Я полагаю, что вам понадобятся маршруты с добавлением для различных операций CRUD, которые будут следовать аналогичной схеме.