Опубликован: 14.11.2006 | Доступ: свободный | Студентов: 5897 / 532 | Оценка: 4.18 / 3.74 | Длительность: 16:37:00
ISBN: 978-5-9556-0085-7
Лекция 11:

Навигация по сайту

< Лекция 10 || Лекция 11: 12345 || Лекция 12 >

Элемент управления Menu

Выпадающее меню можно создать средствами одного только css. Это красивое решение, но требует большого объема кода. Также необходимо предусмотреть возможность просмотра разными браузерами. Большинство разработчиков создают меню с помощью JavaScript. В ASP .NET 2.0 создание выпадающего меню любого уровня вложенности требует всего двух строчек:

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

Вся остальная работа достается ASP .NET. А ее будет много! Чтобы убедиться в этом, посмотрите сгенерированный код в браузере.

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

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

StaticHoverStyle DynamicHoverStyle
StaticMenuItemStyle DynamicMenuItemStyle
StaticMenuStyle DynamicMenuStyle
StaticSelectedStyle DynamicSelectedStyle
StaticTemplate DynamicTemplate

Стили можно поменять "одним махом" с помощью автоформатирования.

Статические пункты отображаются постоянно, а динамические — при выборе родительских узлов. Для этого автоматически генерируется код JavaScript.

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

<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-
1.0" >
  <siteMapNode title="Main" >
    <siteMapNode title=" Главная" url="Default.aspx">
      <siteMapNode url="courses.aspx" title="Курсы" descrip-
tion="Курсы" />
      <siteMapNode url="speciality.aspx" title="Учебные программы" 
description="" />
      <siteMapNode url="shop.aspx" title="Учебники" description="" />
      <siteMapNode url="News.aspx" title="Новости" description="" />
      <siteMapNode url="Forum.aspx" title="Форум"/>
      <siteMapNode url="Help.aspx" title="Помощь"/>
    </siteMapNode>
    <siteMapNode title="user" url="Default2.aspx">
      <siteMapNode url="login.aspx" title="Регистрация" description="" />
      <siteMapNode title="||" >
      <siteMapNode url="records.aspx" title="Зачетка" description="" />
      <siteMapNode url="diploms.aspx" title="Дипломы" description="" />
      </siteMapNode>
      <siteMapNode title="||" >
      <siteMapNode url="user.aspx" title="Настройки" description="" />
      <siteMapNode url="cart.aspx" title="Корзина"/>
      <siteMapNode url="history.aspx" title="Заказы"/>
      <siteMapNode url="account.aspx" title="Личный счет"/>
      </siteMapNode>
    </siteMapNode>
  </siteMapNode>
</siteMap>

Одно меню должно показывать разделы сайта, второе — возможности пользователя:

<asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" 
ShowStartingNode="False" StartingNodeUrl="~/Default.aspx" />
    <asp:Menu ID="Menu1" runat="server" BackColor="#FFFBD6" 
DataSourceID="SiteMapDataSource1" DynamicHorizontalOffset="2" 
Font-Names="Verdana" Font-Size="0.8em" ForeColor="#990000" 
StaticSubMenuIndent="10px" Orientation="Horizontal">
        <StaticMenuItemStyle HorizontalPadding="5px" 
VerticalPadding="2px" />
        <DynamicHoverStyle BackColor="#990000" ForeColor="White" />
        <DynamicMenuStyle BackColor="#FFFBD6" />
        <StaticSelectedStyle BackColor="#FFCC66" />
        <DynamicSelectedStyle BackColor="#FFCC66" />
        <DynamicMenuItemStyle HorizontalPadding="5px" 
VerticalPadding="2px" />
        <StaticHoverStyle BackColor="#990000" ForeColor="White" />
    </asp:Menu>
    <asp:SiteMapDataSource ID="SiteMapDataSource2" runat="server" 
ShowStartingNode="False"
        StartingNodeUrl="~/Default2.aspx" />
     </div>
    <asp:Menu ID="Menu2" runat="server" 
DataSourceID="SiteMapDataSource2"
        Orientation="Horizontal" BackColor="#F7F6F3" 
DynamicHorizontalOffset="2" Font-Names="Verdana" Font-Size="0.8em" 
ForeColor="#7C6F57" StaticSubMenuIndent="10px" 
StaticDisplayLevels="2">
        <StaticMenuItemStyle HorizontalPadding="5px" 
VerticalPadding="2px" />
        <DynamicHoverStyle BackColor="#7C6F57" ForeColor="White" />
        <DynamicMenuStyle BackColor="#F7F6F3" />
        <StaticSelectedStyle BackColor="#5D7B9D" />
        <DynamicSelectedStyle BackColor="#5D7B9D" />
        <DynamicMenuItemStyle HorizontalPadding="5px" VerticalPadding="2px" />
        <StaticHoverStyle BackColor="#7C6F57" ForeColor="White" />
    </asp:Menu>

Пункты меню могут быть описаны на странице, а также добавлены программно:

<asp:Menu ID="Menu3" runat="server" 
    BackColor="#B5C7DE" DynamicHorizontalOffset="2" 
Font-Names="Verdana" 
    Font-Size="0.8em" ForeColor="#284E98" StaticDisplayLevels="3"
    StaticSubMenuIndent="30px">
        <Items>
            <asp:MenuItem Text="Настройки" Value="Настройки" 
Selectable="false" >
                <asp:MenuItem Text="Анкета" Value="Анке-
та"></asp:MenuItem>
                <asp:MenuItem Text="Подписка" Value="Подпи-
ска"></asp:MenuItem>
                <asp:MenuItem Text="Пароль" Value="Па-
роль"></asp:MenuItem>
            </asp:MenuItem>
        </Items>
    </asp:Menu>

Когда элемент управления привязан к карте сайта, то пункты меню представляют собой гиперссылки на страницы. Событие MenuItemClick позволяет определить поведение страницы при выборе пунктов меню, когда он заполняется другими способами, например через XmlDataSource. В параметре MenuEventArgs находится информация и о выбранном пункте, и о родительском узле:

<script runat="server">
   protected void Menu1_MenuItemClick(object sender, 
MenuEventArgs e)
   {
      Listbox1.Items.Add(e.Item.Parent.Value + " : " + 
e.Item.Value);
   }
</script>

Заключение

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

< Лекция 10 || Лекция 11: 12345 || Лекция 12 >
Алексей Савельев
Алексей Савельев

https://technet.microsoft.com/en-us/library/ms143221(v=sql.105).aspx

Денис Прокофьев
Денис Прокофьев

Везде написано, что это самый независимый и простой в использовании навигационный элемент управления, что он работает сразу с web.sitemap и не требует определения SiteMapDataSource.

Моя карта сайта состоит из двух страниц, вложенных друг в друга. asp:Menu, asp:TreeView отбображаются как ожидалось, а вот asp:SiteMapPath - нет. Он не виден нигде. Однако на его месте формируется разметка: <span id="SiteMapPath1"><a href="#SiteMapPath1_SkipLink" style="position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden;">Проход по ссылкам навигации</a><a id="SiteMapPath1_SkipLink"></a></span> - т.е. элемент отрабатывает.

В словах xHTML это выглядит так: <asp:SiteMapPath ID="SiteMapPath1" runat="server" />. Причем не важно - внутри тега form или снаружи - всегда одинаково.

Т.к. другие нав. ЭУ работают через простой источник данных без ошибок, делаю вывод - карта составлена правильно. ИД: <asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" />

Карта: <?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
  <siteMapNode url="~/L11_1_simplePage.aspx" title="Страница 1"  description="Простая страница 1." >
    <siteMapNode url="~/L11_1SimplePage2.aspx" title="Страница 2"  description="Простая страница 2" />
  </siteMapNode>
</siteMap>

Почему так происходит? Вроде делаю все по примерам. VS Community 2015. NetFramework в проекте: v4.0.30319