Подкатегория маршрута MVC 2? - PullRequest
1 голос
/ 29 января 2011

Привет, у меня проблемы с этим, я буквально схожу с ума.У меня есть такой сценарий.Category, Category-SubCategory, Category-SubCategory-SubSubCategory

Я не могу на всю жизнь выяснить этот маршрут.Мои последние и текущие значения выглядят следующим образом:

routes.MapRoute(
            "Navigation", 
            "Navigation/{nav}/{sub}/{subsub}/{id}", 
            new { controller = "Navigation", action = "Site", nav = UrlParameter.Optional, sub = UrlParameter.Optional, subsub = UrlParameter.Optional, id = UrlParameter.Optional }
        );

. Я полагаю, что UrlParameter.Optional пропустит подпрограмму или подподдержку, но вместо этого в качестве параметра будет указан system.UrlParameter.Optional.Любые идеи о том, как это можно сделать?

РЕДАКТИРОВАТЬ 1: пока я ограничил сайт 2 подкатегориями и выполнил 3 маршрута и 3 действия.не очень хорошее решение, но пока работает

Ответы [ 4 ]

1 голос
/ 29 января 2011

Это сценарий, который вы не можете иметь. В определении маршрута может быть только один необязательный параметр, и этот параметр всегда должен быть параметром LAST в вашем маршруте. В противном случае механизм маршрутизации не может устранить неоднозначность между маршрутами, и это правило применяется в ASP.NET MVC 3. Это означает, что nav, sub и subsub не могут быть необязательными. Необходимо всегда указывать значение для этих параметров.

Рассмотрим следующие URL:

Navigation/1
Navigation/1/2

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

0 голосов
/ 30 декабря 2011

Сократите это до одного маршрута, обманывая немного.

routes.MapRoute(
            "navigation",
            "{nav}/{name}",
            new { controller = "Navigation", action = "Page", nav = UrlParameter.Optional, name = UrlParameter.Optional }
        );

и я пишу все категории, подкатегории в навигации, такие как

<%: Html.ActionLink("HOME", "Page", "Navigation", new { nav = "Category/Sub/", name = "Name" }, null)%>

Я полагаю, что {nav} не имеет здесь никакой функции, кроме показа пути к категории, и в случае, если мне нужно его разорвать, используйте разделитель строк.

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

Я согласен с @Darin, что вы, возможно, захотите немного больше подумать о своей архитектуре, но я считаю, что эта серия маршрутов подойдет вам:

 routes.MapRoute(
    "Navigation", 
    "Navigation/{nav}/{sub}/{subsub}/{id}", 
    new { controller = "Navigation", action = "Site", nav = "", sub = "", subsub = "", id = UrlParameter.Optional } 
);

routes.MapRoute(
    "Navigation", 
    "Navigation/{nav}/{sub}/{subsub}", 
    new { controller = "Navigation", action = "Site", nav = "", sub = "", subsub = UrlParameter.Optional, id = "" }
);

routes.MapRoute(
    "Navigation", 
    "Navigation/{nav}/{sub}", 
    new { controller = "Navigation", action = "Site", nav = "", sub = UrlParameter.Optional, subsub = "", id = "" }
);

routes.MapRoute(
    "Navigation", 
    "Navigation/{nav}", 
    new { controller = "Navigation", action = "Site", nav = UrlParameter.Optional, sub = "", subsub = "", id = "" }
);
0 голосов
/ 29 января 2011

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

Например, URL / Navigation / 1,2,, 3

будет преобразовано в действие с одним строковым параметром 'category', который вы можете затем разделить запятой, чтобы получить:

category: 1
sub-cat: 2
sub-sub-cat: empty
sub-sub-sub-cat: 3

Это позволит вам изменить количество подкатегорий без переопределения маршрутизации.

PS. Вместо запятой вы можете использовать другой символ, который не будет использоваться в именах категорий '.

...