Определение настраиваемых маршрутов URL в ASP.Net MVC
У меня определены следующие маршруты:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(name: "Homepage", url: "", defaults: new { controller = "Restaurants", action = "Search" });
routes.MapRoute(name: "About", url: "about", defaults: new { controller = "Home", action = "About" });
routes.MapRoute(name: "Disclaimer", url: "disclaimer", defaults: new { controller = "Home", action = "Disclaimer" });
routes.MapRoute(name: "Contact", url: "contact", defaults: new { controller = "Home", action = "Contact" });
routes.MapRoute(name: "RestaurantDetails", url: "{id}/{slug}", defaults: new { controller = "Restaurant", action = "Details" });
routes.MapRoute(name: "RestaurantLocationDetails", url: "{id}/{restaurantSlug}/{locationSlug}", defaults: new { controller = "Restaurant", action = "LocationDetails" });
routes.MapRoute(name: "Api", url: "api/{action}", defaults: new { controller = "Api" });
}
Я нашел несколько маршрутов, чтобы дать 404, поэтому я установил пакет RouteDebugger NuGet.
Он показывает, что я ожидаю для первых 4 маршрутов, но на последних 3 маршрутах я все еще получаю 404 и, увы, отладчик маршрута не появляется внизу страницы - я надеялся, что это покажет мне, какие биты получили отображается, но я ничего не получаю. Все точки зрения существуют.
Итак, я предполагаю, что ошибаюсь в определениях маршрутов - может ли кто-нибудь пролить свет на это? Кроме того, как я могу заставить Route Debugger показать мне, как URL-адрес сопоставляется в словаре маршрута для тех страниц, которые возвращают 404?
Ответы
Ответ 1
Вам нужно изменить порядок маршрутов.
routes.MapRoute(name: "Homepage", url: "", defaults: new { controller = "Restaurants", action = "Search" });
routes.MapRoute(name: "About", url: "about", defaults: new { controller = "Home", action = "About" });
routes.MapRoute(name: "Disclaimer", url: "disclaimer", defaults: new { controller = "Home", action = "Disclaimer" });
routes.MapRoute(name: "Contact", url: "contact", defaults: new { controller = "Home", action = "Contact" });
routes.MapRoute(name: "Api", url: "api/{action}", defaults: new { controller = "Api" });
routes.MapRoute(name: "RestaurantLocationDetails", url: "{id}/{restaurantSlug}/{locationSlug}", defaults: new { controller = "Restaurant", action = "LocationDetails" });
routes.MapRoute(name: "RestaurantDetails", url: "{id}/{slug}", defaults: new { controller = "Restaurant", action = "Details" });
Маршруты обрабатываются в том порядке, в котором они добавлены в список маршрутов.
Например: api/action
также соответствует маршруту RestaurantDetails
, поскольку в параметрах URL-адреса маршрута есть только два параметра.
Поэтому он должен перейти от конкретного к общему. В общем случае, если у вас одинаковое количество параметров в двух определениях маршрутов, то первый добавленный маршрут будет выбран.