Маршруты ASP.MVC без действия Details

Я бы хотел, чтобы URL-адреса были еще короче, чем /{Controller}/{Action}/{Id}.

Например, мне нужно {Контроллер}/{Идентификатор}, где {Идентификатор} — это строка.

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

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

Мой вопрос: как я могу иметь «зарезервированные» слова, чтобы, если URL-адрес /News/Create, он рассматривался как действие, но если URL-адрес является чем-то другим, например. /News/A-gorilla-ate-my-thesis, то он рассматривается как идентификатор.

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

Обновлять:

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

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

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


person Roger Rogers    schedule 09.03.2010    source источник
comment
Как я понимаю, самое главное не забывать, что порядок, в котором вы прописываете эти маршруты, имеет значение!   -  person Arman Bimatov    schedule 28.07.2013
comment
Тьфу, я не могу заставить DetailsRoute правильно работать с {id} в виде строки. Он обрабатывает мой параметр {id} как действие - The view 'MyStringID' or its master was not found.   -  person Maksim Vi.    schedule 20.01.2015


Ответы (1)


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

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

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

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

person Ben Griswold    schedule 09.03.2010
comment
Это именно то, что мне было нужно, да еще и просто. Работает шарм. Спасибо! - person Roger Rogers; 09.03.2010