ASP.MVC маршруты без действия Подробности - PullRequest
7 голосов
/ 09 марта 2010

Мне бы хотелось, чтобы URL-адреса были даже короче, чем / enjController уговаривающихся

Например, я бы хотел {Controller} / {Id}, где {Id} - строка.

Это позволило бы использовать простые пути, например, Пользователи / Имя пользователя, Страницы / Pagename, Новости / Newsname. Мне это нравится больше, чем требование действия / Details в URL (Users / Details / Username), которое менее элегантно для конечного пользователя.

Я могу легко сделать эту работу, настроив пользовательские маршруты для любого контроллера, для которого я хочу этот уровень простоты. Однако это вызывает головную боль при реализации других действий, таких как {Controller} / {Action}, где {Action} = 'Create', поскольку в этом случае строка {Action} конфликтует со строкой {Id}.

Мой вопрос: как я могу иметь «зарезервированные» слова, чтобы, если URL был / News / Create, он обрабатывался как действие, но если URL является чем-то другим, например, / Новости / А-горилла-ели-моя-тезис, тогда это трактуется как Id.

Я надеюсь, что смогу определить это при настройке моих маршрутов?

Обновление:

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

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

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

1 Ответ

4 голосов
/ 09 марта 2010

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

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

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

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

...