Измените имя вашего параметра year
на id
, и это будет соответствовать маршруту по умолчанию, который MVC добавляет в ваш проект.
Итак, для дальнейшего пояснения давайте взглянем на маршрут по умолчанию, добавленный ASP.NET MVC:
routes.MapRoute(
"default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = "" }
);
На этом маршруте вы можете увидеть три токена, которые названы специально для controller
, action
, а третий токен, который передается в действие, - id
. Когда запрос поступает в ваше приложение, ASP.NET MVC анализирует маршруты, которые в настоящее время сопоставлены, и пытается найти сигнатуру метода, которая соответствует им, используя отражение для ваших контроллеров.
Когда он смотрит на ваш Movie
контроллер, он видит действие с именем ByYear
, однако этот метод принимает целое число с именем year
, а не id
. Вот почему вы получаете что-то вроде /Movie/ByYear?year={year}
, когда вы создаете ActionLink
для этого конкретного действия. Итак, чтобы исправить это, у вас есть два варианта:
Первый и самый простой способ исправить это - просто изменить сигнатуру метода для вашего действия, чтобы он принял параметр с именем id
, что я рекомендовал выше. Это будет работать нормально, но я вижу, где это может вызвать небольшую путаницу, когда вы позже вернетесь к этому источнику и задаетесь вопросом, почему вы вызвали этот параметр id
.
Второй метод - добавить еще один маршрут, соответствующий сигнатуре этого метода. Для этого вы должны открыть свой Global.asax и просто добавить следующее (не проверено, но должно работать):
routes.MapRoute(
"MoviesByYear",
"Movies/ByYear/{year}",
new { controller = "Movie", action = "ByYear" }
);
Да, этот маршрут жестко запрограммирован, но он не нарушит другие маршруты в вашей системе и позволит вам вызвать параметр метода year
.
РЕДАКТИРОВАТЬ 2: Следует также отметить, что механизм маршрутизации остановится на первом найденном маршруте, который соответствует вашему запросу, поэтому любые настраиваемые маршруты, подобные этому, должны быть добавлены перед маршрутом по умолчанию, чтобы вы были уверены, что они будет найден.
person
Scott Anderson
schedule
16.01.2010