ASP.MVC направляет без действия Деталей

Я хотел бы иметь 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, но я все еще смогу быть нацеленным на определенное действие, если я захочу (обновить/удалить/детализировать).

Конечно, необходимо будет запретить зарезервированное, "Создают" слово как идентификатор, иначе пользователь может попытаться создать статью, например, с именем "Создают", к которому никогда нельзя получать доступ.

Это действительно хорошо. Если кто-либо видит, что существует что-то не так с этим подходом, вмешайтесь, но мне нравится он до сих пор.

7
задан Jon Seigel 3 April 2010 в 06:53
поделиться

1 ответ

Думаю, вам осталось создать маршрут для каждого зарезервированного слова. Например,

routes.MapRoute("CreateRoute",
               "{controller}/Create",
                new { action = "Create" }
            );

будет обрабатывать / News / Create, / Users / Create и т. Д.Пока этот маршрут указан перед вашим другим пользовательским маршрутом, я думаю, что вы покрыты.

Я полагаю, вам понадобятся дополнительные маршруты для различных операций CRUD, которые будут следовать аналогичному шаблону.

4
ответ дан 7 December 2019 в 14:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: