Программирование на ASP.NET

Карты сайта

Показывать лекцию целиком
Файлы к лекции Вы можете скачать здесь.

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

  • Файл Web.sitemap с описанием структуры навигации на языке XML (как в базах данных: сами данные)
  • Элементы управления SiteMapDataSource и XmlSiteMapProvider для преобразования описания структуры навигации в объектную модель (как в базах данных: поставщик и источник данных)
  • Элементы управления TreeView, Menu и SiteMapPath, непосредственно взаимодействующие с пользователем при выполнении навигации (как в базах данных: элементы отображения и редактирования данных)
  • Определение карты сайта

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

  • В панели Solution Explorer выделите корень дерева сайта и через контекстное меню вызовите мастер Add New Item. Установите шаблон в значение
  • Оболочка создаст заготовку карты сайта с парным XML-дескриптором <siteMap>... </siteMap> и вложенными дескрипторами узлов <siteMapNode>. Дескриптор <siteMap> поддерживается одноименным классом System.Web.SiteMap, который обеспечивает доступ к иерархическому представлению сайта для выполнения навигации. Заготовка файла Web.sitemap будет выглядеть так

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

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

  • Сайт должен начинаться с одного корневого узла
  • Все узлы карты сайта должны иметь уникальные URL
  • От этого зависит правильная работа класса-поставщика XmlSiteMapProvider, который непосредственно считывает и расшифровывает информацию из файла Web.sitemap. Для считывания информации из файла другого формата потребуется другой нестандартный поставщик.

    Корневой узел и все последующие вложенные в него родительские (раскрывающиеся) узлы иерархического дерева карты сайта должны быть представлены парными дескрипторами <siteMapNode>...</siteMapNode>. Листья дерева можно представить самозакрывающимся (одиночным) дескриптором <siteMapNode>.

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

  • Скорректируйте заготовку файла Web.sitemap, созданного нами ранее, следующим образом
    (рис ) Пример определения карты сайта в файле Web.sitemap<?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 url="~/Products.aspx" title="Товары"  
    					description="Что мы продаем">
    			<siteMapNode url="~/Hardware.aspx" title="Аппаратура"  
    					description="Компьютеры и комплектующие" />
    			<siteMapNode url="~/Software.aspx" title="Программы"  
    					description="Программное обеспечение компьютеров" />
    		</siteMapNode>
    		<siteMapNode url="~/Services.aspx" title="Услуги"  
    					description="Наши услуги">
    			<siteMapNode url="~/Training.aspx" title="Обучение"  
    					description="Обучение программированию" />
    			<siteMapNode url="~/Consulting.aspx" title="Консультации"  
    					description="Консультации по эксплуатации" />
    			<siteMapNode url="~/Support.aspx" title="Поддержка"  
    					description="Помощь в сопровождении программ" />
    		</siteMapNode>
    	</siteMapNode>
    </siteMap>
  • Декларативная привязка к карте сайта

    Создание в приложении файла Web.sitemap в корне виртуального каталога автоматически инициирует запуск поставщика XmlSiteMapProvider. Его задача заключается в извлечении данных карты сайта и заполнении этими данными экземпляра класса SiteMapDataSource, который далее можно подключать для генерации HTML-кода отображения карты сайта к таким элементам, как Menu, TreeView и SiteMapPath. Технологическая цепочка извлечения и отображения данных об иерархии страниц сайта приведена на рисунке

    Навигация с использованием мастер-страниц

    Реализуем эту цепочку для нашего примера, в котором для организации механизма навигации применим мастер-страницы.

  • Через контекстное меню панели Solution Explorer добавьте к корню Web-дерева сайта папку с именем MasterPages, в которой разместим шаблон для страниц, определяемых параметром URL узлов дерева карты сайта
  • Выделите папку
  • Заполните мастер-страницу MasterPage.master следующим кодом
    (рис ) Код мастер-страницы MasterPage.master<%@ Master Language="C#" %>
        
    <script runat="server">
        
        protected void Page_Init(object sender, EventArgs e)
        {
            if (Session["index"] != null)
            {
                // Восстанавливаем состояние радиосписка
                RadioButtonList1.SelectedIndex = (int)Session["index"];
            }
            else
            {
                RadioButtonList1.SelectedIndex = 0;
            }
            
            SelectedIndexChanged(null, EventArgs.Empty);
        }
        
        protected void SelectedIndexChanged(object sender, EventArgs e)
        {
            if (RadioButtonList1.SelectedIndex == 0)
            {
                TreeView1.Visible = true;
                Menu1.Visible = false;
            }
            else
            {
                TreeView1.Visible = false;
                Menu1.Visible = true;
            }
        
            // Запоминаем состояние радиосписка
            Session["index"] = RadioButtonList1.SelectedIndex;
        }
        
    </script>
        
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title>Untitled Page</title>
    </head>
    <body>
        <form id="form1" runat="server">
            <div style="text-align: center">
                <h1 style="color: Red">
                    Пример использования карты сайта
                </h1>
                <table border="1" width="100%">
                <tr>
                    <td colspan="2" style="text-align: center; background-color: Silver">
                        <!-- Сюда помещаются элементы управления навигацией -->
                        <asp:SiteMapPath ID="SiteMapPath1" runat="server">
                            <CurrentNodeTemplate>
                                <i><b style="color: Blue">
                                    <asp:Label ID="Label1" runat="server" 
                                               Text='<%# Eval("title") %>'>
                                    </asp:Label>
                                </i></b>
                            </CurrentNodeTemplate>
                        </asp:SiteMapPath>
                    </td>
                </tr>
                    <tr>
                        <td style="width: 250px; vertical-align: top; background-color: Yellow">
                            <!-- Сюда помещаются элементы управления навигацией -->
                            <asp:TreeView ID="TreeView1" runat="server" 
                                          SelectedNodeStyle-Font-Bold="true"
                                          SelectedNodeStyle-Font-Italic="true"
                                          DataSourceID="SiteMapDataSource1" />
                            <asp:Menu ID="Menu1" runat="server" Orientation="Horizontal" 
                                          DynamicMenuItemStyle-BackColor="Yellow"
                                          DataSourceID="SiteMapDataSource1" />
                        </td>
                        <td style="vertical-align: top; background-color: Aqua">
                            <!-- Сюда помещаются страницы, подгружаемые по уникальным URL узлов -->
                            <asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server" />
                        </td>
                    </tr>
                </table>
                <asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" />
                <br />
                <asp:RadioButtonList ID="RadioButtonList1" runat="server" AutoPostBack="true" 
                                     OnSelectedIndexChanged="SelectedIndexChanged"
                                     BorderStyle="Solid" BorderColor="Red">
                    <asp:ListItem>Использовать TreeView</asp:ListItem>
                    <asp:ListItem>Использовать Menu</asp:ListItem>
                </asp:RadioButtonList>
            </div>
        </form>
    </body>
    </html>
  • В приведенном шаблоне мы определили заголовок и таблицу, состоящую из двух строк и двух столбцов. Столбцы верхней строки мы объединили и поместили в нее элемент SiteMapPath отображения пути и текущего положения пользователя из вкладки Navigation панели Toolbox.

    В левом столбце таблицы мы разместили элементы отображения карты сайта и управления навигацией TreeView1 и Menu1 из вкладки Navigation панели Toolbox. В правом столбце мы зарезервировали место для загрузки страниц с содержимым, которые по атрибуту ContentPlaceHolderID дескриптора

    <asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
     ...
     </asp:Content>

    будут ссылаться на это место.

    Вслед за таблицей (или в любом другом месте) мы разместили неотображаемый объект источника данных SiteMapDataSource1, который привязали к элементам TreeView1 и Menu1 через его свойство DataSourceID. Ниже разместили список радиокнопок, чтобы дать возможность пользователю менять элементы навигации. Свойства столбцов таблицы настроили так, чтобы содержимое размещалось с самого начала, а в верхней строке - посредине.

    В результате получится такой внешний вид мастер-страницы в режиме Design

    В блоке скриптов мы организовали механизм сохранения состояния списка между сеансами приложения, а также механизм смены элементов навигации. Как только мы один из элементов навигации скрываем, он перестает генерировать соответствующий HTML-код. В шаблоне CurrentNodeTemplate элемента SiteMapPath мы связали текстовую метку Label с атрибутом title текущего узла карты сайта, определенной в файле Web.sitemap.

    Теперь нужно создать сами страницы с содержимым, подгружаемым совместно с шаблоном по щелчкам на узлах дерева карты сайта.

  • В панели Solution Explorer щелкните правой кнопкой мыши на шаблоне MasterPage.master и выполните команду контекстного меню Add Content Page, чтобы создать заготовку страницы содержимого Default.aspx. Повторите это действие, чтобы создать 8 заготовок таких страниц
  • Присвойте этим страницам имена согласно XML-файлу карты сайта Web.sitemap:
  • Default.aspx
  • Products.aspx
  • Hardware.aspx
  • Software.aspx
  • Services.aspx
  • Training.aspx
  • Consulting.aspx
  • Support.aspx
  • Отредактируйте содержимое созданных заготовок страниц следующим образом
    Примерное наполнение страниц содержимого
    Default.aspx
    <%@ Page Language="C#" MasterPageFile="~/MasterPages/MasterPage.master" 
                           Title="Untitled Page" %>
        
    <asp:Content ID="Content1" runat="Server" 
                 ContentPlaceHolderID="ContentPlaceHolder1">
        Это содержимое начальной (домашней) страницы Default.aspx, 
        где расположен титульный лист и другие "прибамбасы"
    </asp:Content>
    Products.aspx
    <%@ Page Language="C#" MasterPageFile="~/MasterPages/MasterPage.master" 
                           Title="Untitled Page" %>
        
    <asp:Content ID="Content1" runat="Server" 
                 ContentPlaceHolderID="ContentPlaceHolder1">
        Это содержимое страницы Products.aspx, 
        где расхваливаются товары, которые мы продаем
    </asp:Content>
    Hardware.aspx
    <%@ Page Language="C#" MasterPageFile="~/MasterPages/MasterPage.master" 
                           Title="Untitled Page" %>
        
    <asp:Content ID="Content1" runat="Server" 
                 ContentPlaceHolderID="ContentPlaceHolder1">
        Это содержимое страницы Hardware.aspx, 
        где перечислены компьютеры и комплектующие,
        которыми мы торгуем (спекулируем)
    </asp:Content>
    Software.aspx
    <%@ Page Language="C#" MasterPageFile="~/MasterPages/MasterPage.master" 
                           Title="Untitled Page" %>
        
    <asp:Content ID="Content1" runat="Server" 
                 ContentPlaceHolderID="ContentPlaceHolder1">
        Это содержимое страницы Software.aspx, 
        на которой мы расхваливаем программное обеспечение,
        сворованное у других, но выдаваемое за свое
    </asp:Content>
    Services.aspx
    <%@ Page Language="C#" MasterPageFile="~/MasterPages/MasterPage.master" 
                           Title="Untitled Page" %>
        
    <asp:Content ID="Content1" runat="Server" 
                 ContentPlaceHolderID="ContentPlaceHolder1">
        Это содержимое страницы Services.aspx, 
        на которой мы хвастаемся, что все можем и
        в беде не покинем, а сами только и думаем, 
        как бы обобрать до нитки
    </asp:Content>
    Training.aspx
    <%@ Page Language="C#" MasterPageFile="~/MasterPages/MasterPage.master" 
                           Title="Untitled Page" %>
        
    <asp:Content ID="Content1" runat="Server" 
                 ContentPlaceHolderID="ContentPlaceHolder1">
        Это содержимое страницы Training.aspx, 
        на которой мы популярно объясняем для невежд,
        почему Земля квадратная
    </asp:Content>
    Consulting.aspx
    <%@ Page Language="C#" MasterPageFile="~/MasterPages/MasterPage.master" 
                           Title="Untitled Page" %>
        
    <asp:Content ID="Content1" runat="Server" 
                 ContentPlaceHolderID="ContentPlaceHolder1">
        Это содержимое страницы Consulting.aspx, 
        где мы проводим консультации с нашими клиентами
    </asp:Content>
    Support.aspx
    <%@ Page Language="C#" MasterPageFile="~/MasterPages/MasterPage.master" 
                           Title="Untitled Page" %>
        
    <asp:Content ID="Content1" runat="Server" 
                 ContentPlaceHolderID="ContentPlaceHolder1">
        Это содержимое страницы Support.aspx, 
        на которой мы оказываем поддержку в сопровождении
        программного обеспечения
    </asp:Content>
  • В панели Solution Explorer переместите созданные файлы содержимого из каталога MasterPages в корень сайта
  • Запустите приложение и испытайте его функциональность
  • Результат для двух вариантов будет примерно таким

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

    Некоторые свойства класса SiteMapPath
    Свойство Описание
    ParentLevelsDisplayed Устанавливает длину отображаемой иерархической цепочки. По умолчанию равен -1, означающий, что будут показаны все родительские узлы
    PathDirection Устанавливает порядок отображения узлов:
  • RootToCurrent - слева направо от корневого к текущему
  • CurrentToRoot - слева направо от текущего к корневому
  • PathSeparator Определяет разделитель между отображаемыми узлами. По умолчанию равен символу ">" (больше)
    RenderCurrentNodeAsLink При включении в значение true отображает текущий узел как гиперссылку
    ShowToolTips Отключает всплывающие подсказки над узлами иерархической цепочки, определяемые значениями атрибута description в описании узлов файла Web.sitemap. По умолчанию имеет значение true - всплывающие подсказки включены

    Программное управление картой сайта

    Как мы знаем, узлы карты сайта имеют, в том числе, свойства Url, Title и Description. Именно эти основные свойства и создает мастер оболочки в файле Web.sitemap. Если узел имеет атрибут Url, то пользователь щелчком на нем может переходить к связанной странице. Если в каком-то узле атрибут Url опустить, то узел по-прежнему будет отображаться в иерархии дерева, но не будет действовать как гиперссылка.

    До сих пор мы рассматривали взаимодействие с картой сайта без кода. Но это взаимодействие можно осуществлять и программно. В классе SiteMap, представляющем карту в целом, основные статические свойства RootNode и CurrentNode содержат ссылки на корневой и текущий узлы карты сайта как экземпляры класса SiteMapNode. Любой другой произвольный узел, например, "Консультации", можно найти по его URL таким кодом

    SiteMapNode findNode = SiteMap.Provider.FindSiteMapNode("~/Consulting.aspx");

    Далее с помощью свойств ParentNode, ChildNodes, NextSibling и PreviousSibling экземпляров класса SiteMapNode можно получить программный доступ к соседним узлам иерархии карты сайта.

    Некоторые свойства класса SiteMapNode
    Свойство Описание
    ParentNode Содержит ссылку на родительский по отношению к текущему (найденному) узел. В корневом узле возвращается null - ссылка
    ChildNodes Содержит ссылку на коллекцию дочерних узлов
    HasChildNodes Булево свойство, возвращающее true, если узел имеет дочерние узлы, иначе, false, если это лист дерева
    PreviousSibling Возвращает ссылку на предыдущий узел того же уровня (родственный узел), иначе null, если этот узел единственный. Родственными называются узлы, имеющие одного и того же родителя
    NextSibling Возвращает ссылку на следующий родственный узел, иначе null, если этот узел единственный

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

    Response.Redirect(SiteMap.CurrentNode.ParentNode.Url);

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

  • Добавьте в мастер-странице MasterPage.master к таблице сверху еще одну строку с объединенными столбцами и разместите в ней последовательно две текстовых метки Label с именами lblTitle и lblDescription. Код этого фрагмента будет таким
    <tr>
        <td colspan="2" style="text-align: center">
            <asp:Label ID="lblTitle" runat="server" />
            : nbsp;
            <asp:Label ID="lblDescription" runat="server" />
        </td>
    </tr>
  • Добавьте в мастер-странице MasterPage.master к таблице снизу еще одну строку с объединенными столбцами и разместите в ней последовательно два элемента LinkButton с именами lnkPrevious и lnkNext. Код этого фрагмента будет таким
    <tr>
        <td colspan="2" style="text-align: center">
            <asp:LinkButton ID="lnkPrevious" runat="server" Text="< Назад" />
            nbsp;nbsp;nbsp;
            <asp:LinkButton ID="lnkNext" runat="server" Text="Вперед >" />
        </td>
    </tr>
  • Добавьте в блок скриптов следующий код
    protected void Page_Load(object sender, EventArgs e)
    {
        // Информация о текущем узле
        lblTitle.Text = SiteMap.CurrentNode.Title;
        lblDescription.Text = SiteMap.CurrentNode.Description;
    
        // Управление кнопкой "Назад"
        if (SiteMap.CurrentNode.PreviousSibling != null)
        {
            lnkPrevious.PostBackUrl = SiteMap.CurrentNode.PreviousSibling.Url;
            lnkPrevious.Enabled = true;
        }
        else
            lnkPrevious.Enabled = false;
    
        // Управление кнопкой "Вперед"
        if (SiteMap.CurrentNode.NextSibling != null)
        {
            lnkNext.PostBackUrl = SiteMap.CurrentNode.NextSibling.Url;
            lnkNext.Enabled = true;
        }
        else
            lnkNext.Enabled = false;
    }
  • Запустите приложение и убедитесь, что появилась новая функциональность и все работает!!!
  • Интерфейс пользователя после новых изменений будет таким

    Навигация с использованием фреймов

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

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

    Некоторые элементы кодирования фреймов
    Элемент Описание
    <frameset>
    ...
    </frameset>
    Определяет число фреймов и их размеры. Он делит окно броузера или фрейм (в случае вложенных фреймов) на строки и столбцы
    rows Атрибут дескриптора <frameset>. Задает число строк в броузере или фрейме (в случае вложенных фреймов) для размещения фреймов, а также их высоту. Возможные варианты деления:
  • Целое число - интерпретируется как количество пикселов
  • Целое число с символом % - интерпретируется как проценты от разделяемой области
  • Символ * - интерпретируется как оставшееся пространство
  • Целое число с символом * - интерпретируется как оставшееся пространство с весом
  • Например, код <frameset rows="70, 20%, *, 2*"> ... </frameset> определяет в окне 4 строки сверху вниз: первая строка будет высотой 70 пикселов; вторая займет 20% свободной области, оставшейся от первой строки; последние две строки поделят остальное в пропорциях 1/3 и 2/3 соответственно
    cols Атрибут дескриптора <frameset>. По аналогии с атрибутом rows делит область на столбцы и определяет их размеры в порядке следования в списке слева направо
    frameborder Необязательный атрибут дескриптора <frameset>, который определяет наличие рамки в дочерних фреймах. Принимает значения "yes" или "no"
    <frame> Дескриптор, дочерний для <frameset>, и определяющий содержимое текущего фрейма. Не имеет закрывающего дескриптора.
    src Атрибут дескриптора <frame>. Определяет URL отображаемого в текущем фрейме документа.
    name Атрибут дескриптора <frame>. Определяет имя фрейма для целевой загрузки в него нового документа, адресуемого щелчком пользователя в управляющем документе на ссылке с дополнительным атрибутом target. Если ссылка не содержит атрибута target, то новый документ загружается во фрейм, где была расположена ссылка. Если все ссылки на управляющей странице должны выводить адресуемые документы в одном и том же фрейме, то вместо добавления атрибута target с одинаковым значением в каждую ссылку можно в раздел <head> страницы, где содержатся ссылки, добавить дескриптор <base target="Имя_фрейма">
    scrolling Атрибут дескриптора <frame>. Управляет видимостью полос прокрутки. Может иметь следующие значения:
  • scrolling="auto" - автоматическое появление полос прокрутки, если содержимое документа не помещается в фрейме. При отсутствии атрибута это режим по умолчанию
  • scrolling="yes" - полосы прокрутки присутствуют постоянно
  • scrolling="no" - полосы прокрутки не появляются даже при необходимости
  • noresize Атрибут дескриптора <frame>. Наличие этого атрибута запрещает пользователю изменение размеров фрейма посредством интерактивного перетаскивания границ
    <noframes>
    ...
    </noframes>
    Дескриптор, не имеющий атрибутов. Он включает в себя контейнер <body>...</body>, внутри которого может содержаться альтернативный текст или гиперссылки на случай, если броузер пользователя не поддерживает фреймы. Для броузеров, поддерживающих фреймы, содержимое дескриптора не отображается

    Приведем примеры.

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
    <html>
    <head>
    <title>Untitled Document</title>
    <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
    </head>
    	
    <frameset rows="70%,*">
      <frameset cols="*,*,*">
      	<frame src="Doc1.htm" name="Frame1" scrolling="no" noresize>
    	<frame src="Doc2.htm" name="Frame2" scrolling="auto">
    	<frame src="Doc3.htm" name="Frame3" scrolling="auto">
      </frameset>
      <frameset cols="*,*">
      	<frame src="Doc4.htm" name="Frame1" scrolling="no" noresize>
    	<frame src="Doc5.htm" name="Frame2" scrolling="auto">
      </frameset>
    </frameset>
    <noframes>
    <body>
    </body>
    </noframes>
    </html>
    (рис ) Пример 2 управляющей HTML-страницы с фреймами<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
    <html>
    <head>
    <title>Untitled Document</title>
    <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
    </head>
    	
    <frameset cols="55%,*">
      <frameset rows="*,*,*">
      	<frame src="Doc1.htm" name="Frame1" scrolling="no" noresize>
    	<frame src="Doc2.htm" name="Frame2" scrolling="auto">
    	<frame src="Doc3.htm" name="Frame3" scrolling="auto">
      </frameset>
      <frameset rows="*,*">
      	<frame src="Doc4.htm" name="Frame1" scrolling="no" noresize>
    	<frame src="Doc5.htm" name="Frame2" scrolling="auto">
      </frameset>
    </frameset>
    <noframes>
    <body>
    </body>
    </noframes>
    </html>

    Приведем пример использования фреймов в создании навигационной панели сайта для случая неактивной HTML-страницы.

  • Вызовите для корневого узла проекта контекстное меню и командой Add New Item добавьте к проекту (шаблон HTML Page ) 4 HTML-страницы содержимого с именами
  • Doc1.htm
  • Doc2.htm
  • Doc3.htm
  • Doc4.htm
  • Подпишите эти страницы соответствующим текстом в их дескрипторах <body>
  • Подобным же образом создайте страницу с именем Navigate.htm, содержащую ссылки на страницы содержимого, и заполните ее следующим кодом
    (рис ) HTML-код файла Navigate.htm<html xmlns="http://www.w3.org/1999/xhtml" >
    <head>
        <title>Untitled Page</title>
    </head>
    <body>
        <h1 align="center">
            Навигационная панель</h1>
        <table border="0" width="100%">
            <tr>
                <th>
                    <a href="Doc1.htm" target="DocView">Документ 1 </a>
                </th>
                <th>
                    <a href="Doc2.htm" target="DocView">Документ 2 </a>
                </th>
                <th>
                    <a href="Doc3.htm" target="DocView">Документ 3 </a>
                </th>
                <th>
                    <a href="Doc4.htm" target="DocView">Документ 4 </a>
                </th>
            </tr>
        </table>
    </body>
    </html>
  • Создайте в корне виртуального каталога новую управляющую HTML-страницу с именем FramesControl.htm для размещения фреймов, назначьте ее стартовой и заполните следующим кодом
    (рис ) HTML-код страницы FramesControl.htm<html>
    <head>
        <title>Untitled Document</title>
        <meta content="text/html; charset=windows-1251" http-equiv="Content-Type">
    </head>
        
    <frameset rows="30%,*">
        <frame name="Frame1" scrolling="no" src="Navigate.htm">
        <frame name="DocView" scrolling="auto" src="Doc1.htm">
    </frameset>
    </html>
  • Запустите страницу и получите следующий результат
  • Удалите в документе Navigate.htm атрибуты target, а в заголовочной части этой же страницы Navigate.htm добавьте дескриптор <base target="DocView">. Убедитесь, что навигация работает без изменений
  • Теперь, когда мы познакомились с фреймами, настала пора использовать их в совокупности с картой сайта. Мы не будем сильно усложнять задачу и готовить для ссылок новые страницы. Воспользуемся готовыми страницами, которые ранее определили в файле Web.sitemap. Результат будет немного неказистым, но вполне проиллюстрирует использование фреймов.

  • Добавьте в корень приложения активную страницу с именем FramesPage.aspx, в которой будут расположены фреймы, назначьте ее стартовой и заполните следующим кодом
    (рис ) Управляющая страница FramesPage.aspx навигационной панели<%@ Page Language="C#" %>
        
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>Untitled Page</title>
    </head>
        <frameset rows="70, *">
            <frame src="TitlePage.aspx" />
            <frameset cols="30%, *">
                <frame src="MenuPage.aspx" />
                <frame name="MainFrame" src="Default.aspx">
            </frameset>
        </frameset>
        <noframes>
            <body>
                <h1>Это управляющая страница-шаблон фреймов</h1>
            </body>
        </noframes>
    </html>
  • Мы создали шаблон фреймов из двух строк. Верхняя строка имеет высоту 70 пикселов, а оставшаяся часть занята нижней строкой, поделенной на два столбца. Причем первый столбец займет 30% ширины окна броузера. Обратите внимание на структуру HTML-дескрипторов: дескриптор <body> присутствует только в альтернативном блоке для броузеров, не поддерживающих фреймы. Мы удалили из страницы код дескрипторов <form> и <div>, автоматически сгенерированный мастером. Страница с фреймами не требует обработки на сервере и ей бы больше подошло расширение .htm, но не будем мелочиться и оставим все как есть.

    В первый фрейм, ассоциируемый с верхней строкой, будет загружена страница TitlePage.aspx с простым текстом заголовка. Во второй фрейм поместим страницу MenuPage.aspx, в которой будет располагаться элемент TreeView, связанный с файлом Web.sitemap карты сайта. В третий, именованный фрейм, изначально будет загружена готовая домашняя страница, а затем будут подгружаться другие готовые страницы, выбираемые пользователем щелчком на узлах карты сайта.

  • Создайте новую страницу без файла отделенного кода с именем TitlePage.aspx и заполните ее следующим кодом
    (рис ) Страница TitlePage.aspx с текстом заголовка первого фрейма<%@ Page Language="C#" %>
        
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>Untitled Page</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div style="text-align:center">
            <h2>Это заголовок панели навигации</h2>
        </div>
        </form>
    </body>
    </html>
  • Создайте новую страницу без файла отделенного кода с именем MenuPage.aspx и заполните ее следующим кодом
    (рис ) Страница MenuPage.aspx с элементами TreeView и SiteMapDataSource<%@ Page Language="C#" %>
        
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>Untitled Page</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:TreeView ID="TreeView1" runat="server" 
                          DataSourceID="SiteMapDataSource1" 
                          SelectedNodeStyle-Font-Bold="true"
                          SelectedNodeStyle-Font-Italic="true" 
                          Target="MainFrame" />
            <asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" />
        </div>
        </form>
    </body>
    </html>
    Обратите внимание на атрибут Target="MainFrame" элемента TreeView, который устанавливает для всех ссылок узлов дерева один и тот же именованный фрейм страницы FramesPage.aspx.
  • Протестируйте навигацию с использованием фреймов
  • Результат внешне будет примерно таким

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

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

    Вернуться к учебному плану