MVC3 Navigation и breadcrumb - управляемые данными - PullRequest
3 голосов
/ 04 февраля 2012

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

Мой случай:

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-адресов и повторяется до тех пор, пока вы переходите по иерархии. Результат будет тогда: / книги / 1 / проект-менеджмент / PRINCE2 / книги / 1 это показывает книги prince2 на странице с листированной страницей 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.

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

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

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

1 Ответ

0 голосов
/ 09 февраля 2012

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

        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 я добавляю все категории иерархически, а также добавляю все элементы. Теперь я получаю приличную крошку вплоть до подробной страницы. А поскольку пути (данные маршрутизации и действия) для каждой страницы сведений различны, даже книга, которая отображается в нескольких категориях, отображает правильную цепочку.

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

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

...