Я хотел бы иметь URL, которые еще короче, чем / {Контроллер} / {Действие} / {идентификатор}.
Например, я хотел бы {Контроллер} / {идентификатор}, где {идентификатор} является строкой.
Это допускало бы простые контуры, например, Пользователей/Имя пользователя, Pages/Pagename, News/Newsname. Мне нравится это лучше, чем требование действия Деталей / в URL (Пользователи/Детали/Имя пользователя), который менее изящен для конечного пользователя.
Я могу легко сделать эту работу путем установки пользовательских маршрутов для любого контроллера, для которого я хочу этот уровень простоты. Однако это вызывает головные боли когда дело доходит до реализации других действий, таких как {Контроллер} / {Действие}, где {Действие} = 'Создает', с тех пор, в этом случае строка {Действие} конфликты со строкой {идентификатор}.
Мой вопрос: как я мог 'зарезервировать' слова, так, чтобы, если URL является/News/Create, его рассматривали как действие, но если URL - что-либо еще, например,/News/A-gorilla-ate-my-thesis, то его рассматривают как идентификатор.
Я надеюсь, что могу определить это при установке моих маршрутов?
Используя ответ Ben Griswold, я обновил 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, которые будут следовать аналогичному шаблону.