Определение пользовательских маршрутов URL в ASP.Net MVC - PullRequest
20 голосов
/ 06 мая 2011

У меня определены следующие маршруты:

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 Ответ

22 голосов
/ 07 мая 2011

Вам необходимо изменить порядок маршрутов.

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-адреса маршрута есть только два параметра.

Так что нужно перейти от конкретного к общему. В общем случае, если у вас есть одинаковое количество параметров в двух определениях маршрута, тогда будет выбран первый добавленный маршрут.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...