ASP.NET 2.0 предлагает набор фантастических инструментов для быстрого создания и легкого изменения элементов навигации сайта, среди которых особой популярностью пользуется инструмент Web.sitemap, который представляет собой подробное и полное описание карты сайта в виде внешнего файла формата XML. Содержимое данного файла может с помощью специального поставщика XMLSiteMapProvider динамически привязываться к различным навигационным элементам сайта, таким как панели навигации, выпадающие меню разного типа, "хлебным крошкам" и пр. Идея, согласитесь, великолепная. В свое время я несколько раз делал нечто подобное на php, но в ASP.NET 2.0 такой подход идет, как говорится, по умолчанию.
Однако, очень часто некоторые элементы карты сайта, упомянутые в XML файле Web.sitemap по тем или иным причинам не должны отображаться в навигационных элементах сайта. Для решения этой задачи ASP.NET предлагает несколько стандартных подходов, таких как свойства поставщика карты сайта StartingNodeUrl (указывает с какого узла карты начинать вывод элементов), StartingNodeOffset (определяет лимит количества узлов при выводе), ShowStartingNode (разрешает или запрещает вывод корневого узла карты сайта) и даже инструмент securityTrimmingEnabled, который определяет вывод элементов карты в зависимости от предопределенных ролей пользователя. Кажется набор достаточно обширный, но, к сожалению, не полный.
В случае, когда необходимо по тем или иным причинам пропускать или опускать промежуточные узлы карты при выводе в навигационных элементах сайта без привязки к конкретным ролям пользователей, остается только одно средство – программная корректировка элементов карты в ASP коде документов или мастер-страниц.
Рассмотрим конкретный пример с целью настройки вывода навигационных ссылок в элементе управления Menu, что является наиболее частым случаем. Для выполнения этой задачи добавим к нужным узлам карты сайта файла Web.sitemap атрибут visible="false". Внимание! Добавления этого атрибута необходимо только для тех узлов, которые планируется скрыть в нашем навигационном элементе. Видимые узлы данного атрибута иметь не должны. Итак, скрываемый узел в карте сайта будет выглядеть как-то так:
<siteMapNode url="/userarea/login.aspx" title="Вход" description="Вход для зарегистрированных пользователей" visible="false">Для запуска процесса фильтрации узлов в коде ASP лучше всего "подцепиться" к событию MenuItemDataBound, возникающему в момент привязки данных поставщика карты сайта к элементу управления Menu (не забудьте привязать процедуру обработки события к самому элементу любым доступным способом). Далее в коде осуществляем перебор всех узлов и исключение методом Remove только тех из них, у которых атрибут visible в значении false будет найден. Ниже представлен пример кода для элемента управления Menu с именем Nav (пример написан на С#, но для Visual Basic в целом, исключая особенности синтаксиса, смотрится одинаково):
protected void Nav_MenuItemDataBound(object sender, MenuEventArgs e)
{
SiteMapNode node = e.Item.DataItem as SiteMapNode;
if (!string.IsNullOrEmpty(node["visible"]))
{
bool isVisible;
if (bool.TryParse(node["visible"], out isVisible))
{
if (!isVisible)
{
e.Item.Parent.ChildItems.Remove(e.Item);
}
}
}
}
Итак, это дает нам великолепную возможность сделать так, чтобы элементы навигации, упомянутые в карте сайта Web.sitemap, могли быть с той или иной целью (первичная или вторичная навигация, навигация только по определенному разделу и пр.) пропущены в навигационном элементе сайта.
Удачи!
Леня, привет! Ты на ASP.Net 2.0 подсел? Поздравляю!!!
Как дела? Как жизнь? Или вопрос в нашем стиле: "Сам-то как, в целом?"
Ответить
14.03.2008
В целом, я в порядке! Спасибо! А тут просто для себя один кропномасштабный проект делаю, так что решил "сварить" его на ASP.Net 2.0, тем более, что отличия от первой версии есть большие и достаточно полезный. Ну и в плане, чтобы не отставать от жизни. Кругозор расширяется и что-то полезное начинаешь тащить в разные проекты и тут не важно уже на чем они писаны. Если есть классная модель в ASP, то ее и в PHP реализовать можно. А ты как сам относишься к изменениям во второй версии?
У меня самое первое впечателение было такое - они во вторую версию в качестве новинок привнесли много "хорошо забытого старого", типа мастер-страниц (было такое и во FrontPage, но более напоминает серверную модель шаблонов Dreamweaver'а). Но более всего мне понравились схемы кэширования и готовых страниц и данных, запрашиваемых из базы.
Ответить
14.03.2008