Использование жадного параметра маршрута в середине определения маршрута

Я пытаюсь создать маршруты, которые соответствуют структуре древовидной системы навигации, то есть я хочу включить весь путь в дерево в свой маршрут. Итак, если бы у меня было дерево, которое выглядело бы так

  • Computers
    • Software
      • Development
      • Графика
    • Hardware
      • CPU
      • Видеокарты

Тогда я хотел бы иметь маршруты, которые выглядят так

  • site.com/catalog/computers/software/graphics

Это само по себе несложно, и его можно поймать по маршруту, который выглядит следующим образом

  • каталог / {* категории}

Однако я хочу иметь возможность добавлять информацию о продукте в конце этого URL-адреса, примерно так

  • site.com/catalog/computers/software/graphics/title=Photoshop

Это означало бы, что мне потребовались бы маршруты, которые были определены как в следующих примерах.

  • site.com/{*categories}/title={name}
  • site.com/{*categories}

Однако первый из этих маршрутов недействителен, так как больше ничего не может появиться после жадного параметра, такого как {* категории}, так что я немного застрял. Я думал о реализации маршрутов регулярных выражений или, возможно, об использовании IRouteContraint, чтобы решить эту проблему, но я не могу придумать достойного решения, которое позволило бы мне также использовать Html.ActionLink (...) метод для генерации URL-адресов outbount, которые заполняют как {* Categories}, так и {name}

Любой совет очень приветствуется!

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

ОБНОВЛЕНИЕ 2008/11/26 Я разместил решение по адресу http://thecodejunkie.blogspot.com/2008/11/supporting-complex-route-patterns-with.html


person TheCodeJunkie    schedule 19.11.2008    source источник


Ответы (2)


Маршруты игнорируют параметры строки запроса. Но в то же время параметры строки запроса передаются в метод действия, если нет одноименного параметра URL-адреса маршрута. Поэтому я бы использовал только второй маршрут и передал бы заголовок через строку запроса.

Другой вариант посложнее. Вы пишете собственный маршрут, производный от Route, и переопределяете метод GetRouteData, чтобы он анализировал значение "категорий" (что-то вроде RouteData.Values ​​["категории"], а затем добавляете проанализированные данные в словарь значений маршрута (RouteData.Values ["title"] = parsedTitle.

person Haacked    schedule 19.11.2008
comment
Если бы я использовал параметр querystring, смог бы Html.ActionLink снова отобразить параметр, то же самое для настраиваемого маршрута? Пользовательский маршрут - это нормально, мне просто нужно выяснить, с чего начать. PS. Проверьте почту в своем блоге, у вас есть письмо с запросом на интервью, ожидающее пару дней :-) - person TheCodeJunkie; 19.11.2008
comment
Потребовалось некоторое исследование (отражатель для победы!), Но мне удалось реализовать свой собственный маршрут, чтобы справиться с этим и не только с этим, но это дало мне новое понимание того, как работает маршрутизация. Я обновлю этот пост ссылкой на свой блог, как только напишу, как я решил эту проблему! Спасибо Филу за подсказки! - person TheCodeJunkie; 19.11.2008

Жадный сегмент в любом месте URL

Я написал класс GreedyRoute, который поддерживает жадный (перехватить все) сегмент в любом месте URL-адреса. Прошло много времени с тех пор, как он вам понадобился, но он может быть полезен другим в будущем.

Он поддерживает любой из следующих шаблонов:

  • {segment}/{segment}/{*greedy} - это уже поддерживается классом Route по умолчанию
  • {segment}/{*greedy}/{segment} - жадный посередине
  • {*greedy}/{segment}/{segment} - сначала жадный

Вы можете прочитать все подробности в моем сообщении в блоге, а также получить код.

person Robert Koritnik    schedule 15.03.2011