Как создать универсальный контроллер в ASP.NET MVC? - PullRequest
0 голосов
/ 10 сентября 2011

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

Ответы [ 2 ]

2 голосов
/ 10 сентября 2011

Если вы добавите в свой маршрут новый маршрут, например:

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' для метода '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 () (маршрут по умолчанию)

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

0 голосов
/ 10 сентября 2011

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

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

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

...