Навигация MVC3 и хлебные крошки — управление данными

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

Мое дело :

Interests                   Profiles
|                       |
|_Interest Area 1               |-Profile Area 1
|   |                       |
|   |_Interest Area 1.1             |_List of Books
|       |                       |
|       |_List of Books                 |_Book Detail
|           |
|           |_Book Detail
|_Interest Area 2
    |
    |_List of Books
        |
        |_Book Detail

Иерархия хранится в базе данных. Точки входа Интересы и Профили фиксированы. Оттуда я не знаю, какие будут дети.

Когда дочерних элементов больше не осталось, книги извлекаются на основе значения последней выбранной (под)категории.

У меня здесь две проблемы: 1-я: создание соответствующих маршрутов. Как я хотел бы это:

/books/{id}/{interestareaname}/{subinterestareaname}/{books}/{page}

где имя интереса добавляется для удобных для пользователя URL-адресов и продолжает повторяться, пока вы спускаетесь по иерархии. Вывод тогда будет таким: /books/1/project-management/prince2/books/1 это показывает книги принца2 на стр. 1 постраничного списка.

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

/book/{id}/{interestareaname}/{books}/{page}

Что я сделал для решения проблемы №1:

    routes.MapRoute(
        "Details",
        "view/details/{id}/{booktitle}",
        new { controller = "book", action = "Details", id = "*", booktitle= "*"});

    routes.MapRoute(
        "interests",
        "books/{id}/{level1}/{level2}/{level3}/{page}",
        new { controller = "book", action = "books", level1 = "*", level2 = "*", level3 = "*", id = "0", page = UrlParameter.Optional }
    );
    routes.MapRoute(
        "profiles",
        "books/{id}/{level1}/{level2}/{level3}/{page}",
        new { controller = "book", action = "books", level1 = "*", level2 = "*", level3 = "*", id = "0", page = UrlParameter.Optional }
    );

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

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

Вторая проблема, которая у меня есть, это карта сайта и хлебные крошки. Я использую MVCsitemapprovider и функциональность DynamicNodes.

С картой сайта у меня проблема с отображением страницы сведений. Потому что книги будут появляться как в профилях, так и по интересам. И некоторые книги появятся в нескольких областях интересов или профилях. В каждом случае я хотел бы увидеть путь, по которому я пришел к этой книге.

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

Я провел уже много ночей, и я до сих пор не могу понять это. Если кто-то может помочь или указать мне правильное направление, я очень благодарен.


person Mounhim    schedule 03.02.2012    source источник
comment
Маршруты были сведены к одному единственному маршруту, потому что другие никогда не были достигнуты (выяснилось с помощью routedebugger). Проблема с пейджингом в списке решается с помощью UrlParameter.Optional. Теперь осталась единственная проблема — показать навигационную цепочку при переходе на страницу сведений о книге.   -  person Mounhim    schedule 07.02.2012


Ответы (1)


Единственное решение, которое я нашел для себя до сих пор, - это фактически создать все возможные маршруты, например:

        routes.MapRoute(
            "interest",
            "interest",
            new { controller = "books", action = "viainterest"},
            new { controller = "books", action = "viainterest" }
        );

        routes.MapRoute(
            "interest_1_details",
            "interest/{level1}/view/{id}/{booktitle}",
            new { controller = "books", action = "detailsviainterest_1, level1 = "*", id = 0, booktitle = "*" },
            new { controller = "books", action = "detailsviainterest_1" }
        );

        routes.MapRoute(
                       "interest2details",
                       "interest/{level1}/{level2}/view/{id}/{booktitle}",
                       new { controller = "books", action = "detailsviainterest_2", level1 = "*", level2 = "*", id = 0, booktitle = "*" },
                       new { controller = "books", action = "detailsviainterest_2" }
                   );


        routes.MapRoute(
                        "interestlevel_1",
                        "interest/{id}/{level1}",
                        new { controller = "books", action = "viainterestlevel_1, level1 = "*", id = 0 },
                        new { controller = "books", action = "viainterestlevel_1"}
                    );

        routes.MapRoute(
                       "interestlevel_2",
                       "interest/{id}/{level1}/{level2}",
                       new { controller = "books", action = "viainterestlevel_2", level1 = "*", level2 = "*", id = 0 },
                       new { controller = "books", action = "viainterestlevel_2}
                   );
        //and so on for level 3 and for profiles etc.

В DynamicNodeManager я добавляю все категории иерархически, а также добавляю все элементы. Теперь я получаю приличную навигационную цепочку вплоть до страницы сведений. А поскольку пути (маршрутные данные и действия) для каждой страницы сведений разные, то даже книга, представленная в нескольких категориях, отображает правильную хлебную крошку.

Это решило мою проблему, но я все еще думаю, что должен быть лучший способ. Проблема с текущим решением заключается в том, что дерево будет становиться огромным из-за элементов деталей, которые также добавляются в коллекцию узлов. Другим недостатком является то, что дерево создается при запуске приложения. Таким образом, добавление новой книги не создает узел, пока я не перезагружу веб-приложение.

Так что, если есть другие предложения, я рад их видеть. А пока я могу продолжить содержание, о котором, в конце концов, и пойдет речь.

person Mounhim    schedule 09.02.2012