Как создать подстановочный знак в ASP.NET MVC?

В приложении по умолчанию ASP.NET MVC 3.0 у меня есть контроллер с методами Index () и Details (string id). Они соответствуют / orders / и orders / details / ORDER_ID_HERE. Как изменить маршрутизацию, чтобы сведения соответствовали заказам / ORDER_ID_HERE, а Index () продолжал обслуживать индексную страницу по умолчанию?


person Kelly    schedule 10.09.2011    source источник


Ответы (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 недоступен с помощью System.ArgumentException вместо вызова метода Index () (маршрут по умолчанию)

Отрицательная сторона этого подхода заключается в том, что вам нужно будет сделать это для каждого контроллера, в котором вы хотели бы иметь такую ​​функциональность.

person Major Byte    schedule 10.09.2011
comment
чтобы предотвратить ошибку дома / поиска. Вы можете использовать Regex для обеспечения того, чтобы идентификатор мог быть только числовым. routes.MapRoute (, {контроллер} / {id}, новый {контроллер = Заказы, действие = Детали}, новый {id = @ \ d +}); - person Iridio; 11.09.2011
comment
Позже мне пришло в голову, что можно указывать ограничения. Таким образом, вы можете определить ограничение для идентификатора и для контроллера, поэтому он будет использовать только контроллер заказов. - person Major Byte; 11.09.2011

Попробуйте добавить этот маршрут перед маршрутом по умолчанию:

routes.MapRoute("SomeName", "{controller}/{id}", new { controller = "Orders", action = "Details" });

Обратите внимание, как {действие} было удалено из параметра URL.

person Brian Lyttle    schedule 10.09.2011