#asp.net-mvc #routing
#asp.net-mvc #маршруты
Вопрос:
Я пытаюсь построить маршрут, который ведет к определенной странице продукта.
Продукт существует в категории. Категории также могут существовать в categories. Я пытаюсь сконструировать URL, подобный
my-site.com/products/category/category/category/product
Количество категорий может меняться, но последним параметром всегда будет название продукта.
Есть ли какой-либо способ построить маршрут для этого?
Ответ №1:
Решение именно для вас
Я столкнулся с той же проблемой в прошлом и решил ее немного иначе, чем то, что другие посоветуют вам здесь. Большинство решений будут говорить о * всеобъемлющем параметре. В вашем случае это означает, что вам придется самостоятельно анализировать продукт. Вручную. Поскольку универсальный параметр может быть только последним параметром в определении маршрута.
Универсальный доступ в любом месте маршрута
Если вы хорошенько подумаете об этом, вы действительно можете понять, что параметр catch all фактически может быть определен в любом месте маршрута, если у вас присутствуют все остальные сегменты. Итак, я написал такой класс route, который делает все это и успешно запускается в рабочей среде на веб-сайте с интенсивным трафиком.
В моем сообщении в блоге есть вся информация об этом, а также весь код, который решит вашу проблему:
Пользовательский Asp.net Класс маршрута MVC с универсальным сегментом в любом месте URL
Это позволяет вам определить свой маршрут как:
products/{*categories}/{productId}
Если вы подумаете о всеобъемлющем параметре еще дальше, вы также можете прийти к выводу, что одно определение маршрута может иметь несколько универсальных параметров, если по крайней мере один сегмент между ними является статическим. Но мой класс не может этого сделать, потому что ваш сценарий с одним произвольным набором сегментов гораздо более распространен.
Комментарии:
1. Спасибо за решение, Роберт. У меня есть к вам дополнительный вопрос. Допустим, я хочу удалить название продукта из конца URL. URL становится products/category1/category2 /category3. Я бы хотел, чтобы эта страница была чем-то вроде страницы каталога всех продуктов категории 3. Каталог повышается на уровень, если убрать категорию 3 из URL. Вы знаете, как получить маршрутизацию подобным образом?
2. @Justin: Если к вашим продуктам обращаются
productID
, вы можете выполнить это, установив ограничение маршрута для последнего сегмента. Если нет, то вам может помочь только обычное всеобъемлющее определение.3. @Justin: Видите ли, если вы не можете отличить товары от категорий, то для анализатора маршрутизации так же сложно, как и для человека, узнать, когда последний сегмент все еще является категорией, а когда это действительно продукты. Но, скорее всего, у вас есть категории в читаемых строках и продукты в пронумерованных идентификаторах, и в этом случае второго определения маршрута было бы достаточно категорий. Поэтому наложите ограничение на это определение маршрута и добавьте другое с обычным
products/{*categories}
определением URL.