Как удалить «Детали» в MVC URL Routing, но оставить другие действия без изменений?

StackOverflow https://stackoverflow.com/questions/1001261

  •  05-07-2019
  •  | 
  •  

Вопрос

Я хотел бы настроить маршрут для контроллера, который выполняет обычные операции CRUD, но хотел бы, чтобы действие Details не показывало «Details» в URL. Stackoverflow, похоже, настроил этот тип маршрутизации:

http://stackoverflow.com/questions/999999/
http://stackoverflow.com/questions/ask

Используя эту аналогию, мои маршруты в настоящее время выглядят так:

http://stackoverflow.com/questions/Details/999999/

Добавив следующий маршрут, я смог удалить Details :

routes.MapRoute("Q1", "questions/{id}", 
    new { controller = "Questions", action = "Details" });

Однако выполнение других действий на контроллере (например, / questions / new для этого примера) жалуется на то, что идентификатор не может быть проанализирован.

Есть ли способ настроить маршруты, чтобы мне не приходилось вручную вводить все остальные действия (MapRoute " items / create " items / delete " и т. д.) вручную в Global. asax.cs? По сути, я хотел бы иметь второй маршрут, как:

routes.MapRoute("Q2", "questions/{action}", 
    new { controller = "Questions", action = "Index" });

... и заставить механизм маршрутизации использовать маршрут Q1, если {id} соответствует целому числу, и {action} , если это строка. Это возможно?

Это было полезно?

Решение

Если вы наложите ограничение маршрута на первое, чтобы поле id могло быть только целым числом, то я считаю, что любые другие действия будут выполнены по умолчанию.

routes.MapRoute("Q1", 
   "questions/{id}", 
   new {controller = "Questions", action = "Details"},
   new { id=@"\d+" });

Все остальное должно обрабатываться маршрутом по умолчанию. Итак, "questions / 3553" ударил бы это, но " вопросы / спросить не будет соответствовать. Возможно, вы захотите сначала указать более конкретный маршрут в файле Global.asax.cs.

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