Elvi Digital

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

Удачи!