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 = "" });

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

.../Movies/Category/SubCategory

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

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

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

.../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)%>

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

Спасибо!

Ответов (2)

Решение
routes.MapRoute("Movie", "Movie/{movieId}", 
    new { controller = "Movie", action = "Index", movie = "" });

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

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

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

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