Почему MVC ActionLink генерирует разные типы ссылок?

Я новичок в мире MVC, и у меня есть приложение, над которым я работаю. у меня есть 2 разные ссылки с 2 маршрутами в моем глобальном, которые довольно похожи

маршрут 1

routes.MapRoute("Category", "Movies/{category}/{subcategory}", 
    new { controller = "Catalog", action = "Index", category = "", subcategory = "" });

маршрут 2

routes.MapRoute("Movie", "Movie/{movie}", 
    new { controller = "Movie", action = "Index", movie = "" });

Когда я вызываю actionlink для первого маршрута, он создает его, как я и думал:

.../Movies/Category/SubCategory

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

.../Movie?movieId=ff569575-08ec-4049-93e2-901e7b0cb96a

Раньше я использовал строку вместо guid, и она все еще делала то же самое, т.е.

.../Movie?movieName=Snatch

мои ссылки действий настроены следующим образом

<%= Html.ActionLink(parent.Name, "Index", "Catalog",
    new { category = parent.Name, subCategory = "" }, null)%>

<%= Html.ActionLink(movie.Name, "Index", "Movie", 
    new { movieId = movie.MovieId }, null)%>

Мое приложение все еще работает, но мне показалось это странным. любая помощь будет здорово.

Спасибо!


person Dacrocky    schedule 23.02.2009    source источник


Ответы (2)


routes.MapRoute("Movie", "Movie/{movieId}", 
    new { controller = "Movie", action = "Index", movie = "" });

Должен ли текст маршрута не соответствовать имени свойства, которое вы отправляете по ссылке mvc?

person REA_ANDREW    schedule 23.02.2009
comment
Вы правы в том, что они должны совпадать, но он может захотеть изменить вызов на ActionLink/RouteLink вместо изменения маршрута. - person Craig Stuntz; 24.02.2009
comment
Спасибо, парни. Я смог исправить это, удалив конфликтующие имена. - person Dacrocky; 24.02.2009

Проблема в том, что когда вы вызываете ActionLink, система маршрутизации не может определить, какой из двух маршрутов использовать, поэтому выбирает первый. Решение состоит в том, чтобы использовать RouteLink вместо ActionLink. RouteLink позволяет указать имя маршрута для использования при создании URI. Тогда нет никакой двусмысленности относительно того, какой маршрут использовать. Я думаю, что ActionLink устарел. Я не вижу причин использовать его вместо RouteLink.

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

Эндрю прав (проголосовал), что токены, которые вы используете в ActionLink/RouteLink, и сам маршрут должны совпадать.

person Craig Stuntz    schedule 23.02.2009