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

Я хотел бы настроить маршрут для контроллера, который выполняет обычные операции 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}, если это строка. Это возможно?

1 Ответ

6 голосов
/ 16 июня 2009

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

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

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

...