Навигация по сайту в ASP.NET 2.0 - Ограничения прав доступа к узлам карты сайта (security trimming)
ОГЛАВЛЕНИЕ
Ограничения прав доступа к узлам карты сайта (security trimming)
Навигация на сайте может быть настроена на применение ограничений прав (security trimming), при этом скрывая от пользователя те узлы, к которым у него нет разрешения на доступ.
Модель провайдера карты сайта и ограничение прав (security trimming) применяются для настройки узлов карты сайта, используемых элементами управления навигации. Тем не менее, нам может понадобиться настроить обработанный результат элемента навигации, основываясь на информации карты сайта. Допустим, в нашем элементе управления Menu мы хотим отображать иконку, расположенную рядом с каждым пунктом меню, в зависимости от классификации, указанной для узла карты соответствующего пункта меню. В качестве альтернативы разметка, обработанная встроенными элементами управления ASP.NET, может оказаться непригодной. Вместо того, чтобы отображать TreeView либо Menu, нам наверняка захочется отобразить информацию навигации сайта в виде списка с маркерами. Данную функциональность можно получить при помощи класса SiteMap.
Добавление специализированных атрибутов к узлам карты сайта
В предыдущих главах данной серии статей мы обсуждали способ формирования логической навигационной структуры сайта в качестве карты сайта, которая является иерархическим набором узлов. Каждый узел карты сайта представлен в коде как экземпляр класса SiteMapNode, который обладает такими свойствами, как ChildNodes, ParentNode, Title, Url, и др. Следующая диаграмма отражает карту сайта; каждый блок в диаграмме является узлом карты.

Свойства класса SiteMapNode оповещают о той информации об узле, которая может быть сохранена на карте сайта. Вместо того чтобы ограничивать узлы карты сайта предварительно определенными свойствами в классе SiteMapNode class, Microsoft добавил типовой набор в класс. Имея данный типовой набор, вы можете внедрить любые значения в экземпляр SiteMapNode и связать его со строковым ключем. Набор доступен при использовании следующего синтаксиса:
// C#
siteMapNodeInstance["key"] = value;
object value = siteMapNodeInstance["key"];
' VB
siteMapNodeInstance("key") = value
Dim value as Object = siteMapNodeInstance("key")
Данные специализированные значения могут быть доступны при работе с узлами карты (например, в случае их отображения в элементе Menu), и выводы могут быть сделаны, основываясь на данных значениях.
Конечно, до того как мы начнем работу с данными значениями, нам нужно назначить их экземплярам SiteMapNode, из которых составлена карта сайта. Как вы с этим будете справляться - зависит от того, какой провайдер карты сайта вы используете. Если вы используете стандартный провайдер карты сайта (XmlSiteMapProvider - тот, который хранит карту сайта в файле с XML-кодом), специализированные значения могут быть добавлены как дополнительные атрибуты к элементам <siteMapNode>. К примеру, представьте, что вам нужно добавить изображение в каждый узел элемента TreeView и каждое изображение определить в карте сайта. Мы можем добавить атрибут imageUrl в различные элементы <siteMapNode> следующим образом:
<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
<siteMapNode url="~/Default.aspx" title="Home">
<siteMapNode url="~/Books/Default.aspx" title="Books"
imageUrl="books.jpg">
<siteMapNode url="~/Books/Novels.aspx" title="Novels"
imageUrl="books.jpg" />
<siteMapNode url="~/Books/History.aspx" title="History"
imageUrl="books.jpg" />
<siteMapNode url="~/Books/Romance.aspx" title="Romance"
imageUrl="Heart.gif" />
</siteMapNode>
<siteMapNode url="~/Electronics/Default.aspx" title="Electronics"
imageUrl="electronics.jpg" />
<siteMapNode url="~/DVDs/Default.aspx" title="DVDs"
imageUrl="dvd.png" />
<siteMapNode url="~/Computers/Default.aspx" title="Computers"
imageUrl="computer.png" />
</siteMapNode>
</siteMap>
Указав свойства imageUrl нам теперь нужно настроить элемент навигации, используемый для отображения информации, таким образом, чтобы он отображал указатель изображения (URL). Давайте рассмотрим пример использования элемента TreeView. Начнем с добавления SiteMapDataSource на страницу, затем добавим TreeView, свяжем TreeView с SiteMapDataSource. Далее, создадим обработчик для события TreeView TreeNodeDataBound. Данное событие запускается по разу для каждого узла TreeView после того, как пункт будет привязан к узлу TreeView.
Обработчик события передает экземпляр TreeNodeEventArgs в своем втором параметре, который обладает свойством Node, а тот в свою очередь возвращает привязанный узел TreeView. Узел TreeView обладает свойством DataItem, которое возвращает тот объект, который был привязан к TreeView. Во время использования TreeView для отображения информации карты сайта DataItem является конкретным экземпляром SiteMapNode на сайте и привязан к определенному узлу TreeView.
Следующий код проверяет, обладает ли текущий экземпляр SiteMapNode установленным специализированным значением imageUrl. Если это так, то оно устанавливает свойства узлов TreeView ImageUrl в ~/Images/value, где value является значением атрибута SiteMapNodeimageUrl.
'VB
Protected Sub TreeViewID_TreeNodeDataBound(ByVal sender As Object,
ByVal e As TreeNodeEventArgs) Handles TreeViewID.TreeNodeDataBound
'Ссылаемся на нижеследеющий объект SiteMapNode ...
Dim nodeFromSiteMap As SiteMapNode = CType(e.Node.DataItem, SiteMapNode)
'Если у нас есть значение imageUrl, назначим его свойству узда TreeView ImageUrl
If nodeFromSiteMap("imageUrl") IsNot Nothing Then
e.Node.ImageUrl = System.IO.Path.Combine("~/Images/", nodeFromSiteMap("imageUrl"))
End If
End Sub
// C#
protected void TreeViewID_TreeNodeDataBound(object sender,
TreeNodeEventArgs e)
{
// Ссылаемся на нижеследующий объект SiteMapNode ...
SiteMapNode nodeFromSiteMap = (SiteMapNode) e.Node.DataItem;
// Если у нас есть значение imageUrl, назначим его свойству узда TreeView ImageUrl
if (nodeFromSiteMap("imageUrl") != null)
e.Node.ImageUrl = System.IO.Path.Combine("~/Images/", nodeFromSiteMap["imageUrl"]);
}
