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

Шаблоны дизайна страниц ASP .NET

< Лекция 11 || Лекция 12: 1234 || Лекция 13 >

Содержание по умолчанию

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

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

На странице MainSchool.aspx он отображаться не будет, так как в ней определены оба элемента Content. Однако, если в следующей странице определен только один из элементов Contentѕ

<%@ Page Language="C#" AutoEventWireup="true"  
CodeFile="Voting.aspx.cs" 
Inherits="Voting" MasterPageFile="~/MasterPage.master" %>
<asp:Content ContentPlaceHolderID="ContentPlaceHolder2" 
runat="server">
Какой язык программирования Вы предпочитаете?<br />
    <asp:RadioButtonList ID="rblVoting" runat="server" 
DataSourceID="SqlDataSource1"
        DataTextField="variant" DataValueField="id">
    </asp:RadioButtonList><br />
    <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
ConnectionString="<%$ ConnectionStrings:PollsConnectionString %>"
        SelectCommand="SELECT [id], [variant] FROM [poll] ORDER 
BY [variant] "></asp:SqlDataSource>
    <br />
    <asp:Button ID="Button1" runat="server" Text="Выбрать" 
/><br />
</asp:Content>

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

Программное назначение главной страницы

В странице содержания можно переназначить ее главную страницу программно. Для этого нужно присвоить нужное значение свойству Page.MasterPageFile. Шаблон поменяется независимо от того, какой шаблон был назначен в директиве @Page. Но если попробуете проделать это в функциях Page_Load или Page_Init, получите ошибку времени выполнения.

Это свойство можно изменить только во время обработки события Page_PreInit. Событие Page_PreInit — самая ранняя фаза жизненного цикла страницы, к которой можно получить доступ. Во время события Init главная и дочерняя страница уже сливаются в одну, поэтому поздно менять шаблон. По этой причине событие Page_PreInit — единственное, в обработчике которого можно работать с главной страницей отдельно от страницы содержания:

protected void Page_PreInit(object sender, EventArgs e)
{
Page.MasterPageFile = "~/MyMasterPage.master";
}

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

Label mpLabel = (Label) Master.FindControl("masterPageLabel");
if(mpLabel != null)
{
   //Set content page title to master page control
   Title.Text = mpLabel.Text
}

Страницы шаблона могут иметь методы и свойства. Чтобы можно было обращаться к ним, нужно использовать директиву @MasterType. При этом становится доступен класс страницы шаблона дизайна через строго типизированную ссылку. Атрибут TypeName задает имя типа, а VirtualPath — путь относительно корневого каталога web-приложения к файлу шаблона:

<%@ page language="C#" masterpagefile="~/Site3.master" %>
<%@ mastertype virtualpath="~/Site3.master" %>

Свойства могут быть определены в классе главной страницы:

public String FooterText {
        get { 
            return Footer.Text; 
        }
        set { 
            Footer.Text = value; 
        }
    }

Таким образом, страница разрешает доступ извне к свойствам своих элементов.

Страница содержания меняет это свойство, а элемент управления AdRotator находит с помощью FindControl:

void Page_Load()
  {
    Master.FooterText = "This is a custom footer";
    AdRotator ad = (AdRotator)Master.FindControl("MyAdRotator");
    if (ad != null)
    {
      ad.BorderColor = System.Drawing.Color.Purple;
      ad.BorderWidth = 10;
    }
  }
< Лекция 11 || Лекция 12: 1234 || Лекция 13 >
Алексей Савельев
Алексей Савельев

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