Изменить имя от вашего параметра 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
для этого конкретного действия. Поэтому, чтобы исправить это, у вас есть два варианта:
Первый и самый простой способ исправить это - просто изменить сигнатуру метода для вашего Action, чтобы принять параметр с именем id
, который я рекомендовал выше. Это будет работать нормально, но я могу видеть, где это может вызвать немного путаницы, когда вы вернетесь к этому источнику позже и задаетесь вопросом, почему вы назвали этот параметр id
.
Второй способ - добавить еще один маршрут, соответствующий этой сигнатуре метода. Чтобы сделать это, вы должны открыть Global.asax и добавьте следующую строку (не проверялось, но должно работать):
routes.MapRoute(
"MoviesByYear",
"Movies/ByYear/{year}",
new { controller = "Movie", action = "ByYear" }
);
Этот маршрут жестко, да, но это не будет нарушать другие маршруты в вашей системы, и это позволит вам вызвать параметр метода year
.
EDIT 2: Еще одна вещь, которую следует отметить, заключается в том, что механизм маршрутизации остановится на первом найденном маршруте, который соответствует вашему запросу, поэтому любые настраиваемые маршруты, подобные этому, должны быть добавлены до по умолчанию, поэтому вы уверены, что они будут быть найденным.
Но я не * хочу * назвать это id ... это не идентификатор, это год. Я не хочу разрушать ясность моего кода, чтобы сделать систему маршрутизации MVC счастливой;). Во всяком случае, я нашел ответ через несколько минут после отправки моего вопроса ... –
@Thomas. Действие называется ByYear. Я не думаю, что ясность будет разрушена путем изменения параметра переменной. С другой стороны, переход от маршрутов по умолчанию не помогает ремонтопригодности. –
Да, решение с новым маршрутом - это то, что я в итоге придумал ... Но значит ли это, что мне придется создавать новые маршруты каждый раз, когда я создаю действие с новыми именами параметров?! Спасибо за объяснение в любом случае –