Использование параметра жадного маршрута в середине определения маршрута - PullRequest
0 голосов
/ 19 ноября 2008

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

  • Компьютеры
    • Программное обеспечение
      • Разработка
      • График
    • Оборудование
      • CPU
      • Графические карты

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

  • site.com / Каталог / Компьютеры / Программное обеспечение / графика

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

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

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

  • site.com / Каталог / Компьютеры / Программное обеспечение / графика / название = Photoshop

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

  • site.com / {* категории} / название = {имя}
  • site.com / {*} категории

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

Любой совет очень ценится!

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

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

Ответы [ 2 ]

4 голосов
/ 15 марта 2011

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

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

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

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

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

3 голосов
/ 19 ноября 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...