Слайды лекций В. К. Толстых - Эталонные страницы Master

advertisement
Из цикла лекций «Технологии разработки Internet-приложений» для студентов 4-го курса кафедры Компьютерных
технологий физического факультета Донецкого национального университета
Технологии
разработки Internetприложений
Эталонные страницы –
Master pages
Подготовлено студентом А. Удовиченко
проф. В.К.Толстых, www.tolstykh.com
Общие понятия





В ASP.NET эталонной страницей (“master page”, мастер-страницей) называется
отдельный файл со статической разметкой, ссылки на который задаются на уровне
приложения и отдельных страниц.
Настраиваемые области, которые в каждой производной странице будут содержать свой
контент, в эталонной странице обозначаются специальными элементами управления —
заменителями. Производная страница представляет собой набор блоков, которые
исполняющая среда подставит на место заменителей эталонной страницы.
Мастер-страница подобна обычной странице ASP.NET, отличает ее лишь наличие
директивы Master и одного или нескольких серверных элементов управления
ContentPlaceHolder.
Мастер-страница может не содержать заменителей, и с технической точки зрения она при
этом останется корректной, так что исполняющая среда ASP.NET успешно ее обработает.
Файл эталонной страницы компилируется в класс, производный от класса MasterPage,
который, в свою очередь, является производным от класса UserControl, так что эталонная
страница представляет собой просто особую разновидность пользовательского элемента
управления ASP.NET.
Пример эталонной страницы
<%@ Master Language="C#" CodeFile="Simple.roaster.cs"
Inherits="Simple" %>
<html>
<head runat="server">
<title>Master pages</title>
</head>
<body>
<form id="form1" runat="server">
<asp:Panel ID="HeaderPanel" runat="server"
BackImageUrl="Images/SkyBkgnd.png" Width=100%">
<asp:Сontentplaceholder id="PageBody" runat="server">
<! -- Контент этого элемента определяется другими страницами содержимого -->
</asp:Сontentplaceholder >
...
</form>
</body>
</html>
Файл имеет расширение .master
Атрибуты директивы Master
Атрибут
Описание
ClassName
Имя класса, который будет создан для рендеринга эталонной
страницы. Это может быть любой допустимый для класса
идентификатор, не уточненный именем пространства имен. По
умолчанию класс страницы с именем simple.master называется
ASPsimple_master
CodeFile
URL файла, содержащего связанный с эталонной страницей
программный код
Inherits
Класс отделенного кода, наследуемый эталонной страницей. Это
может быть любой класс, производный от MasterPage
MasterPageFile
Имя файла эталонной страницы, на которую ссылается данная
эталонная страница. Последняя может ссылаться на другую
эталонную страницу, используя тот же механизм, который
обычные страницы используют для ссылки на эталонную. Если
этот атрибут установлен, образуется иерархия эталонных страниц
Страница содержимого
На страницу содержимого, использующую эталонную страницу MasterPage, в директиву Раgе
необходимо добавить атрибут MasterPageFile с указанием имени файла требуемой мастерстраницы:
<%@ Page Language="C#" MasterPageFile="~/SiteTemplate.master"%>
Далее, чтобы предоставить содержимое для элемента управления ContentPlaceHolder
эталонной страницы, необходимо в странице содержимого использовать другой
специализированный элемент управления – Content.
В свойствах (атрибутах) элемента Content указывается в какое место эталонной страницы, для
какого ContentPlaceHolderID, должно вставляться содержимое элемента Content.
Например,
<asp:Content ID="body" ContentPlaceHolderID="PageBody">
<! -- Контент содержимого вставки -->
</asp:Content>
Пример страницы MasterPage
<%@ Master Language="C#" CodeFile="MasterPage.master.cs" Inherits="MasterPage" ... %>
...
<body>
<form id="form1" runat="server">
<div>
...
<!-- MENU -->
<asp:ContentPlaceHolder id="ContentPlaceHolderMenu" runat="server">
</asp:ContentPlaceHolder>
<!-- CONTENT -->
<div id="cont" class="cont">
<div style="vertical-align: top; text-align: left;">
<asp:ContentPlaceHolder id="ContentPlaceHolderBody" runat="server">
</asp:ContentPlaceHolder>
</div>
</div>
</div>
</form></body></html>
Пример страницы содержимого
<%@ Page Language="C#" MasterPageFile="~/MasterPage.master" ... %>
<asp:Content ID="menu" ContentPlaceHolderID="ContentPlaceHolderMenu" Runat="Server">
<asp:Panel id="menu1" runat="server" style="width:100%;">
<table width="100%">
...
</table>
</asp:Panel>
</asp:Content>
<asp:Content ID="body" ContentPlaceHolderID="ContentPlaceHolderBody" Runat="Server">
<asp:Panel ID="pnlInfo" runat="server">
...
</asp:Panel>
</asp:Content>
Содержимое по умолчанию

Когда мастер-страница определяет элемент управления ContentPlaсeHolder, она
может также включать содержимое по умолчанию — содержимое, которое будет
использовано только в том случае, если страница содержимого не предоставит
соответствующий элемент управления Content.
<asp:ContentPlaceHolder id="TitleContent" runat="server">
Master Pages Website!!!
</asp:ContentPlaceHolder>

Страницы содержимого не могут использовать только часть содержимого по умолчанию и
даже частично не могут его редактировать. Это невозможно потому, что содержимое по
умолчанию хранится только на мастер-странице, а не на странице содержимого. В
результате вам придется либо использовать содержимое по умолчанию таким, каким оно
есть, либо заменить его полностью.
Взаимодействие с классом
мастер-страницы
Один из способов доступа к данным элементов эталонной страницы из других страниц
содержимого – это добавление необходимых свойств в класс эталонной страницы по аналогии с
пользовательскими элементами. Например, добавим свойство BannerText на мастерстранице SiteTemplate.master.cs:
public string BannerText
{
get { return lblTitleContent.Text; }
set { lblTitleContent.Text = value; }
}
Вариант 1:
Обращение к свойству BannerText посредством связывания эталонной
страницы класса SiteTemplate с экземпляром master на любой странице содержимого:
protected void Page_Load(object sender, EventArgs e)
{
SiteTemplate master = (SiteTemplate)Page.Master;
master.BannerText = "Content Page #1";
}
Вариант 2:
Пожалуй, более удобный. Необходимо добавить директиву MasterType на
необходимой странице содержимого .aspx:
<%@ MasterType VirtualPath="~/SiteTemplate.master" %>
Далее в реализации её кодов.aspx.sc – обратиться к свойству BannerText:
protected void Page_Load(object sender, EventArgs e)
{
Master.BannerText = "Content Page #1";
}
Вариант 3:
… без обращения к свойствам эталонной страницы, а использование метода
FindControl() для доступа к элементам эталонной страницы как контейнера Master:
protected void Page_Load(object sender, EventArgs e)
{
...
Label lbl = (Label)Master.FindControl("lblTitleContent");
if (lbl != null)
{
lbl.Text = "Content Page #1";
}
}
Download