Подтвердить что ты не робот

Маршрутизация URL-адресов ASP.NET MVC с несколькими значениями маршрута

У меня возникают проблемы с Html.ActionLink, когда у меня есть маршрут, который принимает более одного параметра. Например, учитывая следующие маршруты, определенные в файле Global.asax:

routes.MapRoute(
    "Default",                                              // Route name
    "{controller}.mvc/{action}/{id}",                           // URL with parameters
    new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
);

routes.MapRoute(
    "Tagging",
    "{controller}.mvc/{action}/{tags}",
    new { controller = "Products", action = "Index", tags = "" }
);

routes.MapRoute(
    "SlugsAfterId",
    "{controller}.mvc/{action}/{id}/{slug}",
    new { controller = "Products", action = "Browse", id = "", slug = "" }
);

Первые два маршрута работают без проблем, но когда я пытаюсь создать ссылку действия на третий маршрут, используя:

<%= Html.ActionLink(Html.Encode(product.Name), "Details", new { id = product.ProductId, slug = Html.Encode(product.Name) }) %>

Я получаю URL-адрес, например [site-root]/Details/1? slug = url-slug, тогда как я хотел бы, чтобы URL-адрес был больше похож на [site-root]/Детали/1/URL-слизняк

Кто-нибудь может увидеть, где я ошибаюсь?

4b9b3361

Ответ 1

Он использует первый маршрут, который полностью удовлетворен. Попробуйте поместить маршрут SlugsAfterId выше Default.

В основном это происходит: "Проверить значение по умолчанию. Получил действие? Да. Получил идентификатор? Да. Используйте это и запустите любые другие параметры в строке запроса".

В качестве побочного примечания это сделает ваш маршрут Default лишним, поскольку вы предоставите значение по умолчанию для параметра slug.

Ответ 2

Гарри (вверху) верен. Вы можете использовать отладчик маршрута Mr. Haack для MVC. Это может помочь решить проблемы маршрутизации, показывая вам, какие маршруты попадают и когда.

Вот Сообщение в блоге. И вот Zip File.

Ответ 3

Вы можете добавить ограничение на свои Маршруты, содержащие "id", поскольку он предположительно должен принимать только число. Таким образом, первый маршрут будет соответствовать только тогда, когда "id" является числовым, тогда он сделает второй маршрут для всех других значений. Затем поместите ту, которая включает {slug} наверху, и все должно работать правильно.

routes.MapRoute(
    "SlugsAfterId",
    "{controller}.mvc/{action}/{id}/{slug}",
    new { controller = "Products", action = "Browse", id = "", slug = "" },
    new { id = @"\d+" }
);

routes.MapRoute(
    "Default",                                              // Route name
    "{controller}.mvc/{action}/{id}",                           // URL with parameters
    new { controller = "Home", action = "Index", id = "" },  // Parameter defaults
    new { id = @"\d+" }
);

routes.MapRoute(
    "Tagging",
    "{controller}.mvc/{action}/{tags}",
    new { controller = "Products", action = "Index", tags = "" }
);