Рисунок 1. Структура веб-сайта. |
Рисунок 2. Добавление новой карты сайта. |
<?xml version="1.0"coding="utf-8" ?> <siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" > <siteMapNode url="default.aspx" title="Главная" описание="Мой веб-сайт"> <siteMapNode url="~/products/default.aspx" title="Продукты"> <siteMapNode url="~/products/product1.aspx" title="Первый продукт" /> <siteMapNode url="~/products/product2.aspx" title="Второй продукт" /> </siteMapNode> <siteMapNode url="~/services/default.aspx" title="Services"> <siteMapNode url="~/services/service1.aspx" title="Первая служба" /> <siteMapNode url="~/services/service2.aspx" title="Вторая служба" /> </siteMapNode> <siteMapNode url="contact.aspx" title="Свяжитесь с нами" /> </siteMapNode> </Карта сайта> |
описания | свойства |
отображается | заголовок страницы. Это свойство часто используется элементами управления навигацией для отображения заголовка URL-адреса. |
url | отображает URL-адрес страницы, описанной этим узлом. |
описание | указывает описание этой страницы. Вы можете использовать это описание для отображения содержимого подсказки. |
роли. | Используя обрезку безопасности (обсуждается позже), этот атрибут определяет роли, которым разрешен доступ к этой странице. |
Рисунок 3. Навигация по навигационной цепочке. |
Папка | имени веб-формы |
Default.aspx | Корневой веб-сайт |
Contact.aspx | Корневой веб-сайт |
Default.aspx | Продукты |
Product1.aspx | Продукты |
Product2.aspx | Продукты |
Default.aspx | Службы |
Service1.aspx | Службы |
Service2.aspx | Службы |
<%@ Master Language="C#" AutoEventWireup="true" CodeFile="MasterPage.master.cs" Inherits="MasterPage" %> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="сервер"> <title>Страница без названия</title> </голова> <тело> <form id="form1" runat="server"> <дел> <asp:Label ID="Label1" runat="server" Font-Size="XX-Large" ForeColor="Blue" Text="Добро пожаловать!"></asp:Label><br /> <asp:SiteMapPath ID="SiteMapPath1" runat="сервер" Font-Names="Verdana" Font-Size="0.8em" PathSeparator=" : "> <PathSeparatorStyle Font-Bold="True" ForeColor="#5D7B9D" /> <CurrentNodeStyle ForeColor="#333333" /> <NodeStyle Font-Bold="True" ForeColor="#7C6F57" /> <RootNodeStyle Font-Bold="True" ForeColor="#5D7B9D" /> </asp:SiteMapPath> <бр /> <бр /> <asp:contentplaceholder id="ContentPlaceHolder1" runat="server"> </asp:contentplaceholder> </дел> </форма> </тело> </html> |
Рис. 4. Пример запуска Default.aspx. |
Идентификатор гиперссылки | Свойство текста | NavigateUrl Свойство |
HyperLink1 | Продукты | ~/products/default.aspx |
Службы | HyperLink2 | ~/Services/default.aspx |
HyperLink3 | Свяжитесь с нами | ~/contact.aspxТаблица |
<%@ Page Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" Title="Страница без названия" %> <asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Сервер"> <центр> <таблица> <тр> <td ширина="60%"> <asp:Label ID="Label1" runat="server" Font-Size="X-Large" Text="Добро пожаловать на наш веб-сайт!"></asp:Label></td> </тр> <тр> <td ширина="60%"> <asp:HyperLink ID="HyperLink1" runat="сервер" Font-Size="X-Large" NavigateUrl="~/Products/Default.aspx">Продукты </asp:HyperLink></td> </тр> <тр> <td ширина="60%"> <asp:HyperLink ID="HyperLink2" runat="server" Font-Size="X-Large" NavigateUrl="~/Services/Default.aspx">Сервисы </asp:HyperLink></td> </тр> <тр> <td ширина="60%"> <asp:HyperLink ID="HyperLink3" runat="сервер" Font-Size="X-Large" NavigateUrl="~/Contact.aspx">Свяжитесь с нами </asp:HyperLink></td> </тр> </таблица> </центр> </asp:Content> |
Рисунок 5: Страница по умолчанию папки «Продукты». |
Идентификатор гиперссылки | Текстовое свойство | NavigateUrl Свойство |
HyperLink1 | Первый продукт | ~/products/product1.aspx |
HyperLink2 | Второй продукт | ~/products/product2.aspx |
Рисунок 6. Страница по умолчанию папки «Службы» |
Идентификатор гиперссылки | Текстовое свойство | NavigateUrl Свойство |
HyperLink1 | First Service | ~/Services/service1.aspx |
HyperLink2 | Second Service | ~/Services/service2.aspx |
Текстовый атрибут | имени веб-формы. | Метка
~/Contact.aspx | Свяжитесь с нами |
~/Products/Product1.aspx | Первые сведения о продукте |
~/Products/Product2.aspx | Вторые сведения о продукте |
~/Services/Service1.aspx | Сведения о первой услуге |
~/Services/Service2. aspx | Формасведений о второй службе |
Рисунок 7. Пример запуска Product1.aspx. |
Обратите внимание, как атрибуты title и URL файла web.sitemap используются для создания «хлебных крошек». Также обратите внимание, как родительский элемент отображается вместе с текущим заголовком страницы. Попробуйте перейти на различные страницы и наблюдать за элементом управления SiteMapPath.
4. Используйте элемент управления источником данных SiteMap.
Использование карт сайта не ограничивается элементом управления SiteMapPath. Вы также можете прикрепить карту сайта к элементу управления с возможностью навигации (например, TreeView). В следующем примере вы будете использовать тот же файл карты сайта для реализации привязки к элементу управления TreeView.
Добавьте на веб-сайт новую веб-форму SiteMapDataSourceDemo.aspx. Затем перетащите в форму элемент управления источником данных SiteMap (SiteMapDataSource1) и элемент управления TreeView (TreeView1). Установите для свойства DataSourceID этого элемента управления TreeView значение SiteMapDataSource1. Кроме того, установите для свойства ShowLines элемента управления TreeView значение true. Вот полная разметка со страницы SiteMapDataSourceDemo.aspx:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="SiteMapDataSourceDemo.aspx.cs" Inherits="SiteMapDataSourceDemo" %> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="сервер"> <title>Страница без названия</title> </голова> <тело> <form id="form1" runat="server"> <asp:TreeView ID="TreeView1" runat="server" DataSourceID="SiteMapDataSource1" ШоуЛайнс="Истина"> </asp:TreeView> <asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" /> </форма> </тело> </html> |
Теперь запустите веб-форму и посмотрите, как та же структура навигации автоматически создается в TreeView (см. рис. 8).
Рисунок 8. Привязка файла карты сайта к элементу управления TreeView. |
Описание | свойства |
ChildNodes | представляет коллекцию всех дочерних узлов текущего узла. |
HasChildNodes | указывает, имеет ли узел карты сайта дочерние узлы (истина/ложь). |
Title | возвращает значение атрибута title, указанного в файле карты сайта. |
Url | возвращает в файле карты сайта. Значение указанного атрибута URL-адреса. |
Описание | возвращает значение атрибута описания, указанного в файле карты сайта. |
ParentNode | указывает ссылку на родительский узел карты сайта текущего узла. |
protected void Page_Load (отправитель объекта, EventArgs e) { int count = SiteMap.RootNode.ChildNodes.Count; for (int i = 0; i < count; i++) { SiteMapNode smNode=SiteMap.RootNode.ChildNodes[i]; TreeNode tvNode = новый TreeNode(smNode.Title, "", "", smNode.Url, ""); TreeView1.Nodes.Add(tvNode); если (smNode.HasChildNodes) { int childCount=smNode.ChildNodes.Count; for (int j = 0; j <childCount; j++) { SiteMapNode smChildNode = smNode.ChildNodes[j]; TreeNode tvChildNode = новый TreeNode(smChildNode.Title, "", "", smChildNode.Url, ""); tvNode.ChildNodes.Add(tvChildNode); } } } } |
Здесь вы сначала получаете общее количество дочерних узлов в корневом узле. Затем вы просматриваете коллекцию ChildNodes корневого узла. На каждой итерации вы создаете новый экземпляр класса TreeNode и указываете его заголовок и URL-адрес в его конструкторе. Затем вы добавляете этот TreeNode в коллекцию узлов TreeView. Затем вы проверяете, есть ли у текущего SiteMapNode дочерние узлы. Если есть, вы пересекаете его и повторяете процесс создания TreeNode. Обратите внимание, что на этот раз вы добавляете новые TreeNodes в коллекцию ChildNodes текущего объекта TreeNode.
Обратите внимание, что вы используете 2 в цикле, потому что знаете, что существует только два уровня вложенности. Чтобы сделать вашу логику более общей, вы можете использовать рекурсию для заполнения TreeView.
Запустите веб-форму, и вы снова увидите нечто похожее на рисунок 8.
6. Используйте меры безопасности.
Часто веб-сайты реализуют ролевую модель безопасности. Например, в вашем приложении вы можете иметь разные роли, такие как системный администратор, тестировщик продукта и тестировщик услуг. В подобных ситуациях часто необходимо контролировать ссылки навигации по сайту, которые отображаются пользователям. Например, если у текущего вошедшего в систему пользователя есть роль тестировщика продукта, вы можете захотеть отображать только ссылки, связанные с продуктом, и скрыть все остальные ссылки. Одним из способов управления ролями является использование ручного кодирования, однако для этого требуется программная реализация всей логики авторизации. К счастью, файлы Sitemap и элемент управления источником данных SiteMap вместе предоставляют функцию, называемую обрезкой безопасности, которая поможет вам.
Чтобы протестировать обновленную систему безопасности, вам необходимо включить функции членства и ролей вашего сайта. Откройте файл web.config и добавьте следующие теги:
<режим аутентификации="Формы" /> <разрешение> <запретить пользователей="?"></запретить> </авторизация> |
<roleManager включен = "true" /> |
Рисунок 9. Добавление ролей с помощью инструментов управления веб-сайтом. |
Рисунок 10. Создание пользователей с помощью инструментов управления веб-сайтом. |
<?xml version="1.0"coding="utf-8" ?> <siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" > <siteMapNode url="default.aspx" title="Главная" описание="Мой веб-сайт"> <siteMapNode title="Products" roles="ProductTesters"> <siteMapNode url="~/products/product1.aspx" title="Первый продукт" /> <siteMapNode url="~/products/product2.aspx" title="Второй продукт" /> </siteMapNode> <siteMapNode title="Services" roles="ServiceTesters"> <siteMapNode url="~/services/service1.aspx" title="Первая служба" /> <siteMapNode url="~/services/service2.aspx" title="Вторая служба" /> </siteMapNode> <siteMapNode url="contact.aspx" title="Свяжитесь с нами" /> </siteMapNode> </Карта сайта> |
<siteMap defaultProvider="myprovider" Enabled="true"> <провайдеры> <добавить имя="мойпровайдер" type="System.Web.XmlSiteMapProvider" siteMapFile="SecurityTrimming.sitemap" SecurityTrimmingEnabled="true" /> </провайдеры> |
Рисунок 11: Страница входа в систему |
Рисунок 12. Используйте безопасный ремонт |