Использование Master Page и навигация при построении интернет-приложений
Для того чтобы превратить обычную страницу в страницу содержимого, необходимо в качестве значения свойства MasterPageFile страницы указать имя мастер-страницы, а также добавить на страницу элемент управления <asp:Content>. Данный элемент управления отсутствует на панели элементов управления Toolbox, поэтому его можно создать либо вручную, либо одним из следующих способов:
- Перейти в режим редактирования дизайна страницы содержимого и выполнить команду контекстного меню Create Custom Content элемента управления ContentPlaceHolder (
рис.
6.8). При этом активизируется содержимое данного элемента управления, в результате чего становится возможным вводить текст, а также добавлять другие элементы управления в него. Фактически при этом все вводимые данные размещаются внутри страницы Default.aspx.
увеличить изображение
Рис. 6.8. Создание элемента Content с использованием контекстного меню элемента ContentPlaceHolder<%@ 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>
- При добавлении к Web-приложению новой страницы существует возможность указания мастер-страницы для нее, как показано на рис. 6.9. В этом случае элемент управления <asp:Content> создается автоматически.
После того как страница содержимого создана, можно запустить Web-приложение. Результат представлен на рис. 6.10.
Для демонстрации возможностей перехода между страницами произведем следующие изменения.
Добавим еще одну страницу содержимого, в которую введем текст, как показано на рис. 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 из любой страницы содержимого, использующей в качестве мастер-страницы данную. Для этого необходимо выполнить следующие действия:
- Добавить директиву MasterType в страницу содержимого Default.aspx, как показано ниже:
<%@ MasterType VirtualPath="~/MasterPages/MainMasterPage.master" %>
- В обработчике события 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 %> нежелательно.