Опубликован: 25.09.2008 | Доступ: свободный | Студентов: 3223 / 516 | Оценка: 4.32 / 3.98 | Длительность: 18:50:00
ISBN: 978-5-94774-991-5
Лекция 6:

Использование Master Page и навигация при построении интернет-приложений

< Лекция 5 || Лекция 6: 123 || Лекция 7 >

Для того чтобы превратить обычную страницу в страницу содержимого, необходимо в качестве значения свойства MasterPageFile страницы указать имя мастер-страницы, а также добавить на страницу элемент управления <asp:Content>. Данный элемент управления отсутствует на панели элементов управления Toolbox, поэтому его можно создать либо вручную, либо одним из следующих способов:

  1. Перейти в режим редактирования дизайна страницы содержимого и выполнить команду контекстного меню Create Custom Content элемента управления ContentPlaceHolder ( рис. 6.8). При этом активизируется содержимое данного элемента управления, в результате чего становится возможным вводить текст, а также добавлять другие элементы управления в него. Фактически при этом все вводимые данные размещаются внутри страницы Default.aspx.
    Создание элемента Content с использованием контекстного меню элемента ContentPlaceHolder

    увеличить изображение
    Рис. 6.8. Создание элемента Content с использованием контекстного меню элемента ContentPlaceHolder
    Исходный код страницы Default.aspx в результате проделанных операций, а также ввода текста "это начальная страница Default.aspx", будет выглядеть следующим образом:
    <%@ Page Language="C#" AutoEventWireup="true"
    	CodeFile="Default.aspx.cs" Inherits="_Default"
      MasterPageFile="~/MainMasterPage.master" %>
    <asp:Content ID="Content1" runat="server"
     ContentPlaceHolderID="ContentPlaceHolder1">
      это начальная страница Default.aspx</asp:Content>
  2. При добавлении к Web-приложению новой страницы существует возможность указания мастер-страницы для нее, как показано на рис. 6.9. В этом случае элемент управления <asp:Content> создается автоматически.
    Связка вновь добавляемой страницы содержимого с мастер-страницей

    Рис. 6.9. Связка вновь добавляемой страницы содержимого с мастер-страницей

После того как страница содержимого создана, можно запустить Web-приложение. Результат представлен на рис. 6.10.

Результат работы Web-приложения на основе мастер-страниц

Рис. 6.10. Результат работы Web-приложения на основе мастер-страниц

Для демонстрации возможностей перехода между страницами произведем следующие изменения.

Добавим еще одну страницу содержимого, в которую введем текст, как показано на рис. 6.11. В области меню создадим две ссылки на страницы содержимого.

Страница содержимого с размещенным на ней текстом

Рис. 6.11. Страница содержимого с размещенным на ней текстом

Фрагмент HTML-кода, содержащего ссылки, выглядит следующим образом:

<a href= "Default.aspx">страница1</a><br />
<a href= "Default2.aspx">страница2</a>

Теперь при щелчке по ссылке в области ContentPlaceHolder будет загружаться соответствующая страница.

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

Создатели Web-приложений знают, что достаточно важное значение в этой разработке играют заголовки страниц, а также строки метадискрипторов, от которых зависит индексация страницы поисковыми роботами. Каким же образом возможно задавать заголовки страниц содержимого, ведь они фактически вкладываются в мастер-страницу? Сделать это можно двумя способами - либо задав заголовок страницы в атрибуте Title директивы Page страницы содержимого, как показано ниже,

<%@ Page Language="C#" AutoEventWireup="true" CodeFile=
 "Default.aspx.cs" Inherits="_Default"
 MasterPageFile="~/MasterPages/ MainMasterPage.master"
 Title="Первая страница сайта" %>

либо обратившись к заголовку страницы из программного кода.

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

Page masterPage = base.Master.Page;
masterPage.Header.Title = "заголовок установлен программно";

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

Модифицируем предыдущий пример таким образом, чтобы при обращении к странице Default.aspx с помощью гиперссылки "страница1" в верхней части мастер-страницы отображался текст "Пример обращения к мастер-странице", а при обращении к странице Default2.aspx - текст "Прямой доступ к мастер-странице". При этом рассмотрим различные способы организации доступа к элементам управления, расположенным на мастер-странице.

В первую очередь внесем изменения в саму мастер-страницу, добавив элемент Label в верхнюю ее часть. Значение ID этого элемента установим равным lbl_BannerText. Для обращения к ресурсам мастер-страницы можно использовать либо прямое обращение к ее элементам управления, что нарушает принципы объектного подхода к разграничению прав доступа, либо создать необходимые свойства в классе мастер-страницы.

Добавим свойство BannerText в класс мастер-страницы. Исходный текст свойства выглядит следующим образом:

public string BannerText
{
  get { return lbl_BannerText.Text; }
  set { lbl_BannerText.Text = value; }
}

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

  1. Добавить директиву MasterType в страницу содержимого Default.aspx, как показано ниже:
    <%@ MasterType VirtualPath="~/MasterPages/MainMasterPage.master" %>
  2. В обработчике события Page_Load обратиться к свойству BannerText, установив значение отображаемой строки:
    Master.BannerText = "Пример обращения к мастер-странице";

Возможен и другой способ обращения к элементам управления мастер-страницы. Он очень похож на предыдущий, с той разницей, что тип объекта, возвращаемого с помощью свойства Master, приводится к типу данной мастер-страницы. Приведение типа необходимо, т. к. свойство Master возвращает объект обобщенного типа MasterPage. Естественно, данный объект не содержит тех свойств (в данном случае это BannerText ), которые мы ввели в класс конкретной мастер-страницы. В предыдущем примере приведение не требовалось, т. к. ссылка на тип была доступна через директиву MasterType. Исходный код обращения к свойству BannerText мастер-страницы MainMasterPage будет выглядеть следующим образом:

MainMasterPage master=(MainMasterPage) Master;
master.BannerText= "Пример обращения к мастер-странице";

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

Еще одной возможностью для доступа к элементам мастер-страницы является прямой доступ к ним. Для демонстрации возможностей данного способа создадим пример, в котором страница содержимого Default2.aspx будет изменять текст баннера мастер-страницы на следующий: "Прямой доступ к мастер-странице".

Для этого создадим в обработчике события Page_Load страницы Default2.aspx следующий код:

Label lbl = Master.FindControl("lbl_BannerText") as Label;
 if (lbl != null)
lbl.Text = "Прямой доступ к мастер-странице";

Как видно из данного примера, сначала происходит поиск элемента управления lbl_BannerText, и, в случае успеха, устанавливается значение свойства Text.

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

Для изменения текущей мастер-страницы программным способом необходимо задать имя файла новой мастер-страницы в свойстве Page.MasterPageFile. Делать это можно в событии Page.Prelnit страницы содержимого. При этом нужно учесть следующее: мастер-страницы, на которые будут переключаться страницы содержимого, должны быть "совместимы" друг с другом. Т. е. они должны содержать одинаковые элементы управления (одинакового типа, с одинаковыми значениями ID), в противном случае произойдет ошибка при попытке обращения к какому-либо из них. Кроме того, если страница содержимого, для которой предполагается динамическое изменение мастер-страницы, должна программно обращаться к элементам мастер-страницы, это обращение необходимо осуществлять напрямую, без применения строго типизированного подхода на основе создания свойств мастер-страницы, как было показано ранее. При этом использовать директиву <%@ MasterType %> нежелательно.

< Лекция 5 || Лекция 6: 123 || Лекция 7 >