ASP.NET MVC URL-маршрутизация с несколькими значениями маршрута - PullRequest
50 голосов
/ 09 апреля 2009

У меня проблемы с 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-слизняк

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

Ответы [ 3 ]

60 голосов
/ 09 апреля 2009

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

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

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

32 голосов
/ 09 апреля 2009

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

Вот блог 1004 *. А вот и Zip-файл .

8 голосов
/ 23 июня 2009

Вы можете добавить ограничение к вашим маршрутам, содержащее «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 = "" }
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...