• ASP.NET

    Программное изменение элементов Menu в ASP.NET 2.0

    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

    Комментарии (оставить комментарий)

    Комментарий
    Иван Никитин

    Леня, привет! Ты на ASP.Net 2.0 подсел? Поздравляю!!!
    Как дела? Как жизнь? Или вопрос в нашем стиле: "Сам-то как, в целом?"

    Ответить

    14.03.2008

    Комментарий
    Леонид Лукин

    В целом, я в порядке! Спасибо! А тут просто для себя один кропномасштабный проект делаю, так что решил "сварить" его на ASP.Net 2.0, тем более, что отличия от первой версии есть большие и достаточно полезный. Ну и в плане, чтобы не отставать от жизни. Кругозор расширяется и что-то полезное начинаешь тащить в разные проекты и тут не важно уже на чем они писаны. Если есть классная модель в ASP, то ее и в PHP реализовать можно. А ты как сам относишься к изменениям во второй версии?
    У меня самое первое впечателение было такое - они во вторую версию в качестве новинок привнесли много "хорошо забытого старого", типа мастер-страниц (было такое и во FrontPage, но более напоминает серверную модель шаблонов Dreamweaver'а). Но более всего мне понравились схемы кэширования и готовых страниц и данных, запрашиваемых из базы.

    Ответить

    14.03.2008

    Оставьте свой комментарий

    Ваше имя: Email: Оставьте свой email, если хотите получать уведомления о комментариях на этой странице. Ваш email не будет опубликован на сайте.