MVC3 Navigation и breadcrumb - управляемые данными
Я видел некоторые сообщения о навигации и сухарях, но не нашел 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-адресов и повторяется до тех пор, пока вы переходите по иерархии. Выходные данные будут: /books/1/project-management/prince2/books/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 ответ
Единственное решение, которое я нашел для себя, - это создать все возможные маршруты, например:
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 я иерархически добавляю все категории, а также добавляю все элементы. Теперь я получаю приличную крошку вплоть до подробной страницы. А поскольку пути (Routedata и действия) для каждой страницы сведений различны, даже книга, которая появляется в нескольких категориях, отображает правильные хлебные крошки.
Это решило мою проблему, но я все еще думаю, что должен быть лучший путь. Проблема с текущим решением состоит в том, что дерево вырастет огромным из-за элементов детализации, которые также добавляются в коллекцию узлов. Другим недостатком является то, что дерево генерируется при запуске приложения. Таким образом, добавление новой книги, не создает узел, пока я не сбросил веб-приложение.
Так что, если есть другие предложения, я рад их видеть. Пока я могу продолжить с содержанием, о котором все это в конце.