ActionLink не генерирует правильный URL-адрес маршрутизации для действий с двумя параметрами.

В представлении

@Html.ActionLink("Edit", "Edit", new { id = 1, year = 1 }) 

В контроллере

// GET: /Forecasts/Edit/5
public ActionResult Edit(int id, short year)
{
    ...
}

Он сгенерировал URL-адрес, например

http://<localhost>/controllername/actionname/1?year=1

Я ожидаю, что ссылка на действие сгенерирует URL-адрес, например: http://<localhost>/controllername/actionname/?id=1&year=1

Этот URL-адрес не может быть интерпретирован маршрутизацией MVC по умолчанию, почему URL-адрес не генерируется ожидаемым образом? Спасибо.

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


person anIBMer    schedule 15.05.2013    source источник
comment
из-за используемого вами маршрута по умолчанию. Какие маршруты вы задекларировали?   -  person ppetrov    schedule 15.05.2013


Ответы (2)


Вы используете маршрут по умолчанию, который будет отформатирован следующим образом:

"{controller}/{action}/{id}"

Это означает, что первым параметром будет id, и он будет записан сразу после / без какого-либо именованного параметра GET.

Если вы хотите везде иметь явные параметры, просто используйте эту конфигурацию маршрута:

"{controller}/{action}"

Если вы удалите id, все ваши параметры будут названы.

person ppetrov    schedule 15.05.2013
comment
Спасибо, теперь я понимаю, почему он не генерирует явный URL. - person anIBMer; 16.05.2013

Я ожидаю, что ссылка на действие сгенерирует URL-адрес, например: http://<localhost>/controllername/actionname/?id=1&year=1

Вы не можете ожидать чего-то подобного, если используете маршрут по умолчанию:

routes.MapRoute(
    "Default",
    "{controller}/{action}/{id}",
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

Избавьтесь от {id}, если вы ожидаете такой шаблон URL:

routes.MapRoute(
    "Default",
    "{controller}/{action}",
    new { controller = "Home", action = "Index" }
);
person Darin Dimitrov    schedule 15.05.2013
comment
спасибо, приятель, тот же ответ, что и у @ppetrov, хотя он ответил раньше. Жаль, что я не могу отметить оба как ответы, не знаю почему. - person anIBMer; 16.05.2013