none
Генерация URL. RRS feed

  • Вопрос

  • Суть вопроса такова (пример взят из книги):

    Имеем в приложении один единственный маршрут.
    routes.MapRoute("", "{controller}/{action}/{color}/{page}");

    И пользователя находящегося в URL: /Catalog/List/P­urple/123

    Далее с помощью ActionLink() создаем ссылку:

    @Html.ActionLink("Click me", "List", "Catalog", new { page = 789 }, null)
    В результате своей работы метод ActionLink() вернет
    <a href="/Catalog/List/Purple/789">Click me</a>
    Идем дальше... и снова генерируем с помощью ActionLink() ссылку (при этом пользователь все так же находится на указанном выше URL), но передаем уже в метод анонимный объект с значением для переменной color:
    @Html.ActionLink("Click me", "List", "Catalog", new { color = "Green" }, null)

    В результате своей рабоыт ActionLink() уже вернет пустую ссылку, т.е.

    <a href="">Click me</a>
    Сам вопрос:

    Почему в первом случае (когда было передано { page = 789 }), метод ActionLink() смог взять из строки URL недостающее значение для переменной color, а во втором (когда было передано { color = "Green" }) для переменной page такого не произошло и метод сгенерировал пустую ссылку?

     

    P.S.

    Для внесения ясности, посмотреть данный книжный пример, можно здесь: smarly.net/pro-asp-net-mvc-4/asp-net-mvc-4-in-detail/advanced-routing-features/generating-outgoing-urls-in-views

    Раздел называется - Повторное использование сегментных переменных. Собственно этот пример я и начал разбирать, когда столкнулся с проблемами недопонимания.   

     

    20 сентября 2013 г. 10:20

Все ответы

  • Как уже ответил в блоге, не должна ссылка содержать путую строку. Какая версия платформы у вас? Постараюсь, как будет время, заглянуть в исходники.

    Сделаем содержимое сообщества лучше, вместе!

    20 сентября 2013 г. 11:36
    Модератор
  • Вот это и смущает, что пустая. У меня MVC 3, в 4 версии не проверял, но думаю что там такая же история будет. 

    Как пишут в умных книгах:

    Каждый маршрут проверяется на соответствие, что требует удовлетворения следующих трех условий:

    1. Для каждой переменной сегмента, определенной в шаблоне URL, должно быть доступно значение. При поиске значений для каждой переменной сегмента система маршрутизации просматривает сначала предоставленные значения (используя свойства анонимного типа), затем значения переменных для текущего запроса и, наконец, значения по умолчанию, определенные в маршруте.
    2. Ни одно из значений, предоставленных для переменных сегментов, не должно конфликтовать с переменными, имеющими только значение по умолчанию (это переменные, для которых предоставлены значения по умолчанию, но которые НЕ встречаются в шаблоне URL), которые определены в маршруте.
    3. Значения для всех переменных сегментов должны удовлетворять ограничениям маршрута.

    Лично я первый пункт понимаю как, что если для какой-то переменной сегмента не найдено значение в переданном методу анонимном объекте, то для этой переменной будет произведен поиск значения в текущем запросе, если и там ничего - тогда будут просмотрены значения по умолчанию. Если проверив указанные вещи система так и не нашла значения для переменной сегмента, то маршрут не соответствует генерируемой ссылке и будет произведен переход к следующему маршруту, если таковой имеется.  

    Но так как в нашем случае, для переменной page имеется значение в текущем запросе, а для переменной color в анонимном объекте, маршрут то должен дать соответствие и ссылка по моему мнению не должна быть пустой. 

    • Изменено SP735 21 сентября 2013 г. 7:27
    21 сентября 2013 г. 5:05
  • Проверил с MVC 3 и MVC 4, с исходниками у меня ссылки генерируются нормально, пустых нет. Нормально в том смысле, что не пустые (а так их поведение не всегда правильно).

    Сделаем содержимое сообщества лучше, вместе!

    27 сентября 2013 г. 5:57
    Модератор