Вопрос

Я хотел бы иметь 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, которые будут следовать аналогичной схеме.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top