Маршрут .Net MVC для неопределенного количества папок (структура вложенной категории) - PullRequest
3 голосов
/ 07 января 2011

Я изучаю возможность использования MVC для моего следующего сайта электронной коммерции.Похоже, я не могу понять, могу ли я использовать тот же стандарт URL, который я обычно использую.В настоящее время URL-адрес любого продукта может быть одним из следующих:

  • Категория / подкатегория / Product1.html
  • Категория / подкатегория / SubSubCategory / Product2.html
  • Категория / Подкатегория / SubSubCategory / Product3.html
  • Категория / Подкатегория / SubSubCategory / SubSubSubCategory / Product4.html

и т. Д.

У меня возникла проблемас вложенной структурой категорий.Пока что я придумал только следующее:

routes.MapRoute(
    "Products",
    "{categories}/{productname}",
    new { controller = "Product", action = "Details", productname = UrlParameter.Optional },
    new { categories = @"\w+/\w+" }
);

Я надеялся, что {категории} могут быть сопоставлены с любым из следующих пунктов, которые я мог бы обработать, чтобы определить правильную категорию, котораяТовар принадлежит:

  • Спорт / Теннис / Ракетки / ProductA
  • Спорт / Бадминтон / Ракетки / ProductB

Но приведенный выше маршрут не работает правильно.

Кто-нибудь знает, как этого можно достичь, или нет?сделано?

Ответы [ 3 ]

5 голосов
/ 07 января 2011

Система маршрутизации позволяет определять параметры перехвата, которые игнорируют косую черту и захват все до конца URL. Определите параметр как зацепку, поставив перед ним префикс звездочка (*).

routes.MapRoute(null, "Articles/{*articlePath}",
    new { controller = "Articles", action = "Show" }
);

В шаблоне URL может быть только один параметр catchall, и он должен быть последним (т. Е. самая правая) вещь в URL, так как она захватывает весь путь URL с этого момента.

Одна оговорка, она ничего не захватывает из строки запроса, так как объекты маршрута смотрят только на часть пути URL.

Параметры Catchall полезны, если вы позволяете посетителям перемещаться по какому-то произвольному иерархия глубин, например, в системе управления контентом (CMS).

Вы можете использовать объект RouteData для извлечения информации о маршруте. Для ваших нужд вы, вероятно, создадите собственный обработчик маршрута, который будет анализировать данные маршрута и вызывать правильные методы контроллера.

0 голосов
/ 08 января 2011

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

Допустим, мы называем категории Теннис и Бадминтон и Ракетки в этих категориях как класс продукта

Вам нужен способ доступа к параметрам category, productClass и productName.Предположим, что «Спорт» в этом случае исправлен, я сделаю это так:

routes.MapRoute(
"Products",
"sport/{category}/{productClass}/{productName}",
new { controller = "Product", action = "Details", productClass = UrlParameter.Optional, productName = UrlParameter.Optional }

);

Ваш метод действия будет примерно таким:

public ActionResult Details(string category, string productClass, string productName){
//Do whatever you need to do in order to get the specified product

}

0 голосов
/ 07 января 2011

Вы можете использовать Области в MVC2

Таким образом, это будет выглядеть следующим образом: Площадь / Контроллер / Вид / id

Так что в вашем случае это будет:Теннис Контроллер, Rackets the view, ProductA - идентификатор или строка запроса,

http://www.asp.net/mvc/videos/aspnet-mvc-2-areas

Надеюсь, это имеет смысл.

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