В приложении по умолчанию ASP.NET MVC 3.0 у меня есть контроллер с методами Index () и Details (string id). Они соответствуют / orders / и orders / details / ORDER_ID_HERE. Как изменить маршрутизацию, чтобы сведения соответствовали заказам / ORDER_ID_HERE, а Index () продолжал обслуживать индексную страницу по умолчанию?
Как создать подстановочный знак в ASP.NET MVC?
Ответы (2)
Если вы добавите новый маршрут в свою коллекцию маршрутов, например:
routes.MapRoute(
"Detailed", // Route name
"{contoller}/{id}", // URL with parameters
new { controller = "Orders", action = "Details", id = UrlParameter.Optional } // Parameter defaults
);
Это сработает, но вы многое нарушите, например, URL-адрес типа [site] / Home / Search приведет к:
System.ArgumentException: словарь параметров содержит пустую запись для параметра id типа System.Int32, не допускающего значения NULL, для метода System.Web.Mvc.ActionResult Details (Int32) в MvcApplication3.Controllers.OrdersController.
Причина в том, что / Home / Search соответствует маршруту {controller}/{id}
.
Другой, похожий способ решить эту проблему:
routes.MapRoute(
"Detailed", // Route name
"order/{id}", // URL with parameters
new { controller = "Orders", action = "Details", id = UrlParameter.Optional } // Parameter defaults
);
Убедитесь, что статическая часть в маршруте, order, не соответствует имени вашего фактического контроллера заказов, иначе у вас возникнет та же проблема, с отображением [url] / orders em> недоступен с помощью System.ArgumentException вместо вызова метода Index () (маршрут по умолчанию)
Отрицательная сторона этого подхода заключается в том, что вам нужно будет сделать это для каждого контроллера, в котором вы хотели бы иметь такую функциональность.
Попробуйте добавить этот маршрут перед маршрутом по умолчанию:
routes.MapRoute("SomeName", "{controller}/{id}", new { controller = "Orders", action = "Details" });
Обратите внимание, как {действие} было удалено из параметра URL.