Карта сайта

154

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

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

В лучших традициях средств ASP.NET навигация в ASP.NET является гибкой, конфигурируемой и подключаемой. Она состоит из трех компонентов:

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

Взаимосвязь между этими компонентами показана на рисунке ниже:

Навигация ASP.NET с помощью карт сайта

Определение карты сайта

Отправной точкой в системе навигации сайта, построенной на основе карты, является поставщик карты сайта. ASP.NET распространяется с единственным поставщиком карты сайта XmlSiteMapProvider, который может извлекать информацию о карте сайта из XML-файла. Если требуется получить карту сайта из другого расположения или в специальном формате, придется создать собственный поставщик карты сайта - эта тема рассматривается в следующей статье.

Поставщик XmlSiteMapProvider ищет файл Web.sitemap в корне виртуального каталога. Подобно всем поставщикам карт сайта, его задача заключается в извлечении данных карты сайта и создании соответствующего объекта SiteMap. Затем этот объект SiteMap может быть сделан доступным другим элементам управления посредством SiteMapDataSource.

Чтобы проверить его в действии, создайте файл Web.sitemap и определите структуру веб-сайта с помощью элементов <siteMap> и <siteMapNode>. Чтобы добавить карту сайта в Visual Studio, выберите пункт меню Website --> Add New item, укажите шаблон Site Map и щелкните на кнопке Add.

Базовая структура файла карты сайта, имеет следующий вид:

<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
    <siteMapNode>
      <siteMapNode ...></siteMapNode>
      <siteMapNode ...></siteMapNode>
    </siteMapNode>
</siteMap>

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

Каждый узел карты сайта должен содержать заголовок, описание и URL-адрес, как показано в следующем примере:

<siteMapNode url="~/default.aspx" title="Главная"  description="Главная страница сайта">

В этом примере для указания URL-адреса использован синтаксис относительного пути ~/, который указывает на корневую папку веб-приложения. Этот стиль не обязателен, но настоятельно рекомендуется, поскольку он гарантирует правильную интерпретацию ссылок карты сайта независимо от текущей папки.

Теперь элемент <siteMapNode> можно использовать для создания карты сайта. Единственное дополнительное ограничение заключается в том, что нельзя создавать два узла карты сайта, имеющие одинаковый URL-адрес.

В самой системе навигации ограничение на дублирование URL-адресов отсутствует. Просто это ограничение накладывается поставщиком карты сайта XmlSiteMapProvider, поскольку он применяет URL-адрес в качестве уникального ключа. Если создать собственный поставщик карты сайта или воспользоваться сторонним поставщиком, можно разрешить дублированные URL-адреса и затребовать отдельного указания информации о ключах. Однако соблюдение правила о том, что каждый сайт должен начинаться с одного корневого узла, является обязательным, поскольку оно реализовано в базовом классе SiteMapProvider. (Как вскоре будет показано, по-прежнему можно применять различные варианты отображения дерева карты сайта, однако начинать всегда нужно с одного домашнего узла.)

Ниже приведен пример карты сайта:

<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
    <siteMapNode url="~/default.aspx" title="Главная"  description="Главная страница сайта">
      <siteMapNode title="Товары" description="Наши товары" url="~/Products.aspx" >
        <siteMapNode title="Комплектующие ПК" description="Процессоры, видеокарты, жесткие диски"
          url="~/Hardware.aspx" />
        <siteMapNode title="Программы" description="Visual Studio, Expression Blend, Windows Server"
          url="~/Software.aspx" />
      </siteMapNode>

      <siteMapNode title="Службы" description="Наши службы тех. поддержки, обучения и др."
                   url="~/Services.aspx">
        <siteMapNode title="Обучение" description="Мы научим использовать вас наши программные продукты"
          url="~/Training.aspx" />
        <siteMapNode title="Консультации" description="Задавайте ваши вопросы"
          url="~/Consulting.aspx" />
        <siteMapNode title="Тех. поддержка" description="Помогаем 24/7"
          url="~/Support.aspx" />
      </siteMapNode>

    </siteMapNode>
</siteMap>

В этом примере все узлы содержат URL-адреса - т.е. на них можно щелкать (в результате чего пользователи переходят к определенным страницам). Однако если эти узлы должны служить просто категориями для организации других ссылок, атрибут url можно опустить. Узел по-прежнему будет находиться среди привязанных элементов управления, но не будет отображаться в виде ссылки.

Привязка к карте сайта

Как только файл Web.sitemap определен, его можно использовать в странице. Здесь как раз очень удобно применять мастер-страницы, чтобы элементы управления навигацией можно было определять как части шаблона и повторно их использовать в каждой странице. Ниже показано, как в мастер-странице SiteTemplate.master определить базовую структуру, которая помещает элементы управления навигации слева и создает объект SiteMapDataSource, предоставляющий навигационную информацию другим элементам управления:

<%@ Master Language="C#" AutoEventWireup="true" CodeFile="SiteTemplate.master.cs" 
   Inherits="SiteTemplate" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <table>
                <tr>
                    <td style="width: 226px; vertical-align: top;">
                        <!-- Здесь будут размещаться элементы навигации -->
                    </td>
                    <td style="vertical-align: top; color:green; padding-left:20px">
                        <asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server" />
                    </td>
                </tr>
            </table>
        </div>

        <asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" />

    </form>
</body>
</html>

Теперь можно создать дочернюю страницу с простым статическим содержимым:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" 
    Inherits="_Default" Title="Главная"  %>

<asp:Content ID="Content1" runat="server" ContentPlaceHolderID="ContentPlaceHolder1">
    <h1>Главная</h1>
</asp:Content>

Единственное, что осталось сделать - это выбрать элементы управления для отображения данных карты сайта. В качестве решения, пригодного на все случаи жизни, можно воспользоваться элементом управления TreeView. Можно добавить TreeView и привязать его к элементу управления SiteMapDataSource на мастер-странице с помощью DataSourceID, как показано ниже:

<!-- В мастер-странице SiteTemplate.master -->
	...
<td style="width: 226px; vertical-align: top;">
	<asp:TreeView ID="TreeView1" runat="server" DataSourceID="SiteMapDataSource1" />
</td>
	...
Навигация с помощью TreeView

Или же воспользоваться элементом управления Menu:

<!-- В мастер-странице SiteTemplate.master -->
	...
<td style="width: 226px; vertical-align: top;">
	<asp:Menu ID="Menu1" runat="server" DataSourceID="SiteMapDataSource1" />
</td>
	...
Навигация с помощью Menu

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

Навигационные цепочки

В действительности ASP.NET определяет три элемента управления навигацией: TreeView, Menu и SiteMapPath. Элемент SiteMapPath обеспечивает навигационную цепочку ("хлебные крошки" - breadcrumb) - т.е. элемент управления показывает текущее положение пользователя и позволяет ему с помощью ссылок переходить вверх по иерархии на более высокий уровень. На рисунке ниже показан элемент управления SiteMapPath, когда пользователь находится на странице Hardware.aspx. С помощью элемента управления SiteMapPath пользователь может вернуться на страницу Products.aspx или Home.aspx:

Навигационная цепочка, поддерживаемая элементом управления SiteMapPath

Элемент управления SiteMapPath обладает небольшим, но очень важным отличием от остальных элементов управления навигации, таких как TreeView и Menu. Элемент SiteMapPath работает непосредственно с моделью навигации ASP.NET - другими словами, ему не нужно получать свои данные через элемент управления SiteMapDataSource. В результате элемент управления SiteMapPath можно использовать в страницах, не имеющих элемента управления SiteMapDataSource, а изменение свойств SiteMapDataSource не будет оказывать влияние на SiteMapPath.

Элемент управления SiteMapPath определяется следующим образом:

<asp:SiteMapPath ID="SiteMapPath1" runat="server" />

Как правило, элемент управления SiteMapPath помещают на мастер-странице, чтобы он мог отображаться на всех страницах содержимого.

Элемент управления SiteMapPath полезен как для мгновенного получения представления о текущей позиции, так и для перемещения вверх по иерархии. Однако его всегда нужно использовать совместно с другими элементами управления навигацией, которые позволяют пользователю перемещаться вниз по иерархии карты сайта.

Элемент управления SiteMapPath можно также настраивать самым подробным образом. Некоторые из наиболее часто конфигурируемых свойств перечислены в таблице ниже:

Свойства SiteMapPath, связанные с внешним видом
Свойство Описание
ShowToolTips

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

ParentLevelsDisplayed

Определяет максимальное количество одновременно отображаемых родительских уровней. По умолчанию это свойство имеет значение -1, которое означает, что будут показаны все уровни

RenderCurrentNodeAsLink

Если это свойство установить в true, часть страницы, указывающая текущую страницу, превращается в выбираемую ссылку. По умолчанию это свойство имеет значение false, т.к. пользователь уже находится на текущей странице

PathDirection

На выбор доступны два варианта: RootToCurrent (по умолчанию) и CurrentToRoot (порядок уровней в пути меняется на противоположный)

PathSeparator

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

Для достижения еще большего контроля элемент управления SiteMapPath можно сконфигурировать с помощью стилей или даже переопределить элементы управления и HTML-содержимое с помощью шаблонов:

Стили и шаблоны элемента управления SiteMapPath
Стиль Шаблон Применение
PathSeparatorStyle PathSeparatorTemplate

Разделитель между всеми узлами

NodeStyle NodeTemplate

Применяется ко всем частям пути за исключением корневого и текущего узла

CurrentNodeStyle CurrentNodeTemplate

Применяется к узлу, представляющему текущую страницу

RootNodeStyle RootNodeTemplate

Применяется к узлу, представляющему корневой узел. Если корневым узлом является текущий узел, используются стили или шаблон текущего узла

Например, в следующем элементе управления SiteMapPath используется изображение стрелки в качестве разделителя и фиксированная строка полужирного текста для корневого узла. Финальная часть пути, которая представляет текущую страницу, выделяется курсивом:

<asp:SiteMapPath ID="SiteMapPath2" runat="server">
    <PathSeparatorTemplate>
        <asp:Image ID="Image1" runat="server" ImageUrl="~/arrowright.gif"
            GenerateEmptyAlternateText="true" />
    </PathSeparatorTemplate>
    <RootNodeTemplate>
        <b style="border-radius: 4px; border: 2px solid #5cadff; padding: 5px; color: #5cadff">
            Главная</b>
    </RootNodeTemplate>
    <CurrentNodeTemplate>
        <em>
            <asp:Label ID="Label1" runat="server"
                Text='<%# Eval("title") %>' />
        </em>
    </CurrentNodeTemplate>
</asp:SiteMapPath>
Стилизация навигационных цепочек

Обратите внимание на то, как CurrentNodeTemplate использует выражение привязки данных для связывания со свойством title текущего узла. Аналогичным образом можно также получить атрибуты url и description, объявляемые в файле карты сайта.

Отображение части карты сайта

В примерах, рассмотренных до настоящего момента, элементы управления страницы в точности воспроизводили структуру файла карты сайта. Однако это подходит не всегда. Например, отображение крупной карты сайта может отвлечь пользователя от той части веб-сайта, которую он просматривает в данный момент времени. Кроме того, карта сайта может иметь настолько много уровней, что все дерево не помещается полностью на веб-странице.

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

Пропуск корневого узла

Как правило, дерево карты сайта начинается с единственного корневого узла. Часто такой способ построения карты сайта оказывается непригодным. Он ведет к дополнительному уровню вложения в структуре карты сайта, в результате чего она занимает больше места, и к появлению ссылки верхнего уровня, которая может оказаться достаточно бесполезной.

То, как узел "Главная" отображается в предыдущем примере, может быть не удобным. Чтобы исправить эту ситуацию, свойство SiteMapDataSource.ShowStartingNode может быть установлено в false. Если же все же желательно, чтобы элемент "Главная" отображался, измените файл карты сайта так, чтобы он определял этот узел в первой группе страниц (непосредственно перед Products). Реальный корневой узел не будет отображаться, поэтому URL-адрес ему не требуется.

Ниже представлен пример измененной карты сайта:

<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
    <siteMapNode title="Root" description="Root">
      <siteMapNode url="~/default.aspx" title="Главная"  description="Главная страница сайта" />
      <siteMapNode title="Товары" description="Наши товары" url="~/Products.aspx" >
        ...
      </siteMapNode>

      <siteMapNode title="Службы" description="Наши службы тех. поддержки, обучения и др."
                   url="~/Services.aspx">
       ...
      </siteMapNode>

    </siteMapNode>
</siteMap>
Карта сайта без корневого узла

Выбор текущего узла в качестве начального

В предыдущем примере было показано, как можно пропустить корневой узел. Еще одна имеющаяся возможность - отображение только части всей карты сайта, начиная с текущего узла. Например, элемент управления, такой как TreeView, можно использовать для отображения всех элементов иерархии, начиная с текущего узла. Если пользователь захочет перейти на уровень вверх, он может использовать другой элемент управления (например, SiteMapPath).

Для реализации этого дизайна достаточно установить свойство SiteMapDataSource.StartFromCurrentNode в true.

Элемент управления SiteMapPath по-прежнему будет показывать всю иерархию, т.к. он не использует элемент управления SiteMapDataSource. (Таким образом, пользователь может щелкнуть на ссылке в элементе управления SiteMapPath, чтобы перейти к странице более высокого уровня.) Однако остальные связанные элементы управления вроде TreeView будут отображать только те страницы, которые находятся ниже текущей, давая возможность пользователю перемещаться вниз по иерархии.

По-прежнему можно использовать свойство ShowStartingNode, но теперь оно определяет, будет ли отображаться текущий узел, поскольку он является начальной точкой для дерева навигации. Пример ситуации, когда свойства StartFromCurrentNode и ShowStartingNode установлены в true, приведен на рисунке ниже. Текущей является страница Products.aspx. Элемент управления SiteMapPath отображает страницы верхнего уровня, а элемент управления TreeView - узлы, находящиеся ниже Products.aspx (Hardware.aspx и Software.aspx):

Привязка только к дочерним узлам

Чтобы эта технология могла работать, платформа ASP.NET должна уметь находить в файле Web.sitemap страницу, соответствующую текущему URL-адресу. В противном случае она не сможет определить текущую позицию и не предоставит нужную информацию привязанным элементам управления.

Выбор определенного узла в качестве начального

Элемент управления SiteMapDataSource имеет еще два свойства, которые могут помочь в конфигурировании дерева навигации - StartingNodeOffset и StartingNodeUrl.

Свойство StartingNodeUrl проще для понимания - оно принимает URL-адрес узла, который должен быть первым в дереве. Это значение должно в точности совпадать с атрибутом url узла в файле Web.sitemap. Например, если свойство StartingNodeUrl определено как "~/default.aspx", то первым узлом в дереве будет "Главная", и вы будете видеть только те узлы, которые находятся под ним.

Свойство StartingNodeUrl особенно полезно, если требуется варьировать между небольшим количеством различных карт сайта (например, менее десяти). Идеальное решение в этом случае - определение нескольких файлов карты сайта и привязка к нужному из них. К сожалению, по умолчанию XmlSiteMapProvider поддерживает только один файл карты сайта, поэтому понадобится другой механизм. В данном случае решение будет заключаться в разделении различных карт сайта на отдельные ветви файла Web.sitemap.

Например, предположим, что веб-сайт должен содержать разделы Dealer (Дилер) и раздел Employee (Сотрудник). Можно создать две различные структуры и определить каждую из них в различных ветвях одного и того же файла, как показано ниже:

<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
    <siteMapNode title="Root" description="Root">
    
      <siteMapNode url="~/default.aspx" title="Дилер"  description="Дилер">
      		...
      </siteMapNode>
      <siteMapNode url="~/default_employee.aspx" title="Сотрудник"  description="Сотрудник">
      		...
      </siteMapNode>

    </siteMapNode>
</siteMap>

Теперь для привязки меню к представлению Dealer свойство StartingNodeUrl должно быть установлено в "~/default.aspx". Это можно сделать программно либо, что более практично, создав совершенно другую мастер-страницу и реализовав ее во всех страницах Dealer. В страницах Employee свойство StartingNodeUrl необходимо установить в "~/default_employee.aspx". В результате будут отображаться только те страницы, которые находятся ниже ветви Employee карты сайта.

Можно поступить еще проще, с помощью атрибута siteMapFile разбив всю карту сайта на отдельные файлы:

<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
    <siteMapNode title="Root" description="Root">
      <siteMapNode siteMapFile="Dealers.sitemap" />
      <siteMapNode siteMapFile="Employees.sitemap" />
    </siteMapNode>
</siteMap>

Но даже при использовании этой технологии вы будете ограничены одним деревом карты сайта, которое всегда начинается с файла Web.sitemap. Однако управление картой сайта можно упростить за счет вынесения некоторой части ее содержимого в отдельные файлы.

Эта технология существенно ограничена, поскольку элемент управления XmlSiteMapProvider не позволяет дублировать URL-адреса. Это значит, что повторное использование одной и той же страницы более чем в одной ветви карты сайта невозможно. Хотя и можно попытаться обойти эту проблему, создавая различные эквивалентные друг другу URL-адреса (например, добавляя в конец URL дополнительные параметры строки запроса), это может привести к возникновению еще больших проблем. Если эти ограничения неприемлемы для конкретного сценария, то наилучшим выходом будет проектирование собственного поставщика карты сайта.

Свойство SiteMapDataSource.StartingNodeOffset применяется наиболее часто. Оно принимает целое число, которое дает элементу управления SiteMapDataSource команду на переход на определенное количество уровней вниз по дереву (если это число положительное) или вверх по дереву (если число отрицательное). Разработчики часто упускают из виду один очень важный нюанс: когда элемент управления SiteMapDataSource выполняет перемещение вниз по дереву, он движется по направлению к текущему узлу. Если же этот узел уже является текущим или смещение выводит его за пределы текущего узла, SiteMapDataSource не будет знать, куда двигаться, поэтому в конечном итоге вы получите пустой элемент управления навигацией.

Чтобы понять, как это работает, рассмотрим следующий пример. Предположим, что в настоящий момент мы находимся на следующей странице веб-сайта:

Default > Products > Software > Custom > Contact Us

Если SiteMapDataSource начинается с узла Default (по умолчанию), а свойству StartingNodeOffset присвоено значение 2, то элемент управления перейдет на два уровня вниз и привяжется к дереву, расположенному ниже этого узла. В нашем примере этим узлом является Software:

Software > Custom > Contact Us

Это означает, что можно будет перейти к любой ссылке в группах Software или Custom, но никуда больше (по крайней мере, если сначала не перейти на уровень выше или не выбрать другой элемент управления).

Если вы попытаетесь перейти вниз на слишком много уровней - например, когда пользователь находится на странице второго уровня, а свойству StartingNodeOffset присвоено значение 3 - элемент SiteMapDataSource не сможет подсчитать количество уровней, и связанные элементы управления останутся пустыми.

Еще одна полезная технология - переход вверх от текущего узла. Например, если свойство StartFromCurrentNode установить в true, а свойство StartingNodeOffset в -3, то элемент управления SiteMapDataSource перейдет на три уровня вверх, начиная с текущей страницы (Contact Us) и выполнит привязку к следующему дереву:

Products > Software > Custom > Contact Us

Эта технология несколько более полезна, поскольку она гарантирует, что элементы управления навигацией всегда будут отображать одно и то же количество уровней. При попытке перешагнуть через корневой узел просто отобразится столько уровней, сколько возможно. Например, если свойству StartingNodeOffset присвоить значение -3, а пользователь в данный момент времени будет находиться на странице второго уровня (такой как Software), привязка будет выполнена к следующему дереву:

Products > Software

Чтобы определиться с правильной комбинацией параметров SiteMapDataSource, которые желательно использовать, придется немного поэкспериментировать.

StartingNodeOffset и StartFromCurrentNode - специализированные свойства, которые никогда не используются на многих веб-сайтах. Тем не менее, они могут оказаться полезными, если придется иметь дело со сложным деревом карты сайта с множеством уровней вложений. В этом случае эти свойства можно использовать для сокращения количества одновременно отображаемых уровней. Это упрощает чтение и понимание навигационных ссылок (по крайней мере, они станут более компактными и не будут занимать полезное пространство на веб-странице). Чтобы добиться этого же эффекта с помощью элемента управления SiteMapPath (который не использует SiteMapDataSource), можно установить свойство SiteMapPath.ParentLevelsDisplayed.

Объекты карты сайта

Для отображения иерархии навигации можно применять не только связывание без кода. С информацией о навигации можно взаимодействовать и программно. Навигация программными средствами применяется в двух случаях:

API-интерфейс карты сайта очень прост. Чтобы его использовать, нужно работать с двумя классами из пространства имен System.Web. Начальной точкой служит класс SiteMap, который предоставляет статические свойства CurrentNode (узел карты сайта, представляющий текущую страницу) и RootNode (корневой узел карты сайта). Оба эти свойства возвращают объект SiteMapNode. С его помощью можно извлекать информацию из карты сайта, включая значения title, description и url. Навигационные свойства, с помощью которых можно работать со связанными узлами, перечислены в таблице ниже:

Свойства навигации объекта SiteMapNode
Свойство Описание
ParentNode

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

ChildNodes

Предоставляет коллекцию всех дочерних узлов. Проверяет свойство HasChildNodes для выяснения, существуют ли дочерние узлы

PreviousSibling

Возвращает предыдущий узел, который находится на том же уровне (или ссылку null, если ни одного такого узла не существует)

NextSibling

Возвращает следующий узел, который находится на том же уровне (или ссылку null, если ни одного такого узла не существует)

Поиск узлов можно также осуществлять с помощью методов текущего объекта SiteMapProvider, который доступен посредством статического свойства SiteMap.Provider. Например, метод SiteMap.Provider.FindSiteMapNode() позволяет выполнять поиск узла по его URL-адресу.

Чтобы увидеть эти свойства в действии, рассмотрим следующий код, который настраивает на странице две метки для отображения информации заголовка и описания, полученной из текущего узла:

protected void Page_Load(object sender, EventArgs e)
{
	Label1.Text = SiteMap.CurrentNode.Title;
	Label2.Text = SiteMap.CurrentNode.Description;
}

Следующий пример несколько более сложен. В нем реализуется кнопка Next, которая позволяет пользователю перемещаться по всей совокупности вложенных узлов. В этом коде проверяется существование родственных узлов, и если они не будут найдены в требуемой позиции, код просто скроет ссылку:

protected void Page_Load(object sender, EventArgs e)
{
	if (SiteMap.CurrentNode.NextSibling != null)
	{
	    HyperLink1.NavigateUrl = SiteMap.CurrentNode.NextSibling.Url;
	    HyperLink1.Visible = true;
	}
	else
	{
	    HyperLink1.Visible = false;
	}
}

Добавление специальной информации о карте сайта

В картах сайта, которые были рассмотрены до настоящего момента, для узла предоставлялся заголовок, описание и URL-адрес. Это минимальный объем информации, который придется использовать. Однако схема для XML-карты сайта является открытой, а это означает, что можно свободно вставлять специальные атрибуты с собственными данными.

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

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

Например, следующий код отображает карту сайта, использующую атрибут target для указания того, что браузер откроет новую вкладку при переходе по этой ссылке:

<siteMapNode title="Товары" description="Наши товары" url="~/Products.aspx" target="_blank">
   ...

Теперь в коде можно использовать несколько возможностей. Если в элементе управления навигацией используется шаблон, можно выполнить привязку непосредственно к новому атрибуту. Если элемент управления навигацией не поддерживает шаблоны (или вы не хотите создавать шаблон), придется найти другой подход. Классы TreeView и Menu поддерживают событие, генерируемое при привязке отдельного элемента (TreeNodeDataBound и MenuItemDataBound). Затем можно настроить текущий элемент, чтобы применить новую цель, нужно воспользоваться следующим кодом:

protected void TreeView1_TreeNodeDataBound(object sender, TreeNodeEventArgs e)
{
	e.Node.Target = ((SiteMapNode)e.Node.DataItem)["target"];
}

Обратите внимание, что специальный атрибут нельзя извлечь из строго типизированного свойства. Вместо этого его извлекают по имени с помощью индексатора SiteMapNode.

Пройди тесты
Лучший чат для C# программистов