Маршрут с необязательным параметром не разрешен правильно - PullRequest
0 голосов
/ 19 августа 2011

Вот необходимый код для воспроизведения очень странной проблемы с маршрутизацией ASP.NET MVC 3.0:

Регистрация маршрута в Global.asax.cs:

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

Здесь мы объявляем маршрут к истории пользователя. Но в URL мы хотим «Клиент» вместо «Пользователь». Также обратите внимание на параметр someParam. Контроллер User действительно существует и имеет действие History.

Теперь используется вид:

<a href="<%= Url.Action("History", "User") %>">History</a>
<a href="<%= Url.Action("History", "User", new { someParam="qqq" }) %>">History with param</a>

Я использую здесь Url.Action() вместо Html.ActionLink() только для ясности.

И вот результат - как эта часть представления была отображена:

<a href="/Customer/History">History</a>
<a href="/User/History?someParam=qqq">History with param</a>

Теперь проблема ясна - URL без параметров был разрешен правильно, а URL с параметром начинается с "/ User" вместо "/Customer".

Вопросы:

  1. Это нормальное поведение? Если да, почему маршрутизация работает таким образом?
  2. Есть ли обходной путь для этого? Я имею в виду, есть ли способ получить окончательный результат как:

    <a href="/Customer/History">History</a>
    <a href="/Customer/History?someParam=qqq">History with param</a>
    

1 Ответ

1 голос
/ 19 августа 2011

Я подозреваю, что это сбивает с толку, потому что ваш маршрут для Клиента не перечисляет это дополнительное значение, но по умолчанию.Попробуйте это:

routes.MapRoute("History", "Customer/History/{someParam}", new {controller = "User", action = "History", someParam = UrlParameter.Optional});

Или для предварительного извлечения синтаксиса ссылки строки запроса, это:

routes.MapRoute("History", "Customer/History/{id}", new {controller = "User", action = "History", id = UrlParameter.Optional});

Во втором случае вы не указываете значение id при создании ссылки (Ваш звонок на Url. Действие не должно измениться.)

...