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

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

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

В качестве примера добавим к предыдущему примеру еще одну мастер-страницу OtherMasterPage, которая будет содержать те же элементы управления, что и MainMasterPage, однако ее оформление будет выглядеть так, как показано на рис. 6.12.

Вторая мастер-страница, добавленная к Web-приложению

Рис. 6.12. Вторая мастер-страница, добавленная к Web-приложению

Добавим в обе мастер-страницы кнопку "Изменить мастер-страницу", ID которой равно btn_ChangeMasterPage. Обработчик события этой кнопки для обеих мастер-страниц будет одинаковым.

protected void btn_ChangeMasterPage_Click(object sender,
EventArgs e)
{
  if (Request.Browser.Cookies)
  {
    if (Request.Cookies["masterpage"] != null)
    {
      if (Request.Cookies["masterpage"].Value == "1")
        Response.Cookies["masterpage"].Value = "2";
      else
        Response.Cookies["masterpage"].Value = "1";
    }
    else
    {
      HttpCookie mpage = new HttpCookie("masterpage");
      mpage.Expires = DateTime.Now.AddDays(1);
      mpage.Value = "2";
      Response.Cookies.Add(mpage);
    }
  }
  Response.Redirect(Request.RawUrl);
}

Как видно, здесь применяется механизм Cookies для запоминания текущей мастер-страницы, а также задания той из них, которая будет использоваться в качестве текущей. Сам cookie назван masterpage. При значении masterpage=1 активной будет мастер-страница MainMasterPage, при masterpage=2 - OtherMasterPage. Команда Response.Redirect (Request.RawUrl) ; необходима для того, чтобы перегрузить текущую страницу, изменив, таким образом, ее внешний вид за счет подключения другой мастер-страницы. Само подключение другой мастер-страницы происходит в обработчике события Page.PreInit каждой страницы содержимого. В данном примере для обеих страниц содержимого, хранящихся в файлах Default.aspx и Default2.aspx, создан одинаковый обработчик события Page.PreInit, исходный код которого приведен ниже.

protected void Page_PreInit(object sender, EventArgs e)
  {
    if (Request.Browser.Cookies)
      if (Request.Cookies["masterpage"] != null)
        if (Request.Cookies["masterpage"].Value == "1")
        {
Page.MasterPageFile = "~//MasterPages// MainMasterPage.master";
        }
        else
        {
Page.MasterPageFile = "~//MasterPages// OtherMasterPage.master";
        }
  }

В зависимости от значения cookie masterpage устанавливается текущая мастер-страница.

В результате при нажатии на кнопку Изменить мастер-страницу оформление текущей страницы изменится, а содержимое останется прежним ( рис. 6.13).

Пример динамического изменения мастер-страницы

увеличить изображение
Рис. 6.13. Пример динамического изменения мастер-страницы

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

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

Мастер-страница верхнего уровня ( RootMasterPage.master ):

<%@ Master Language="C#" AutoEventWireup="true"
 CodeFile="RootMasterPage.master.cs" Inherits="RootMasterPage" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
  <title>Untitled Page</title>
</head>
<body>
  <form id="form1" runat="server">
  <div>
    <table border="0" cellpadding="0" cellspacing="0"
    style="width: 100%; height: 100%">
      <tr>
        <td style="height: 7px">
          <h1>Общий заголовок для всех страниц
           Web-приложения</h1>
        </td>
      </tr>
      <tr>
        <td>
          <asp:ContentPlaceHolder ID="ContentPlaceHolder1"
           runat="server">
          </asp:ContentPlaceHolder>
        </td>
      </tr>
    </table>
  </div>
  </form>
</body>
</html>

Мастер-страница второго уровня ( Node1MasterPage.master ):

<%@ Master Language="C#" AutoEventWireup="true"
CodeFile="Node1MasterPage.master.cs" Inherits="Node1MasterPage"
MasterPageFile="~/MasterPages/RootMasterPage.master" %>
  <asp:Content ID="Content1"
   ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
    <table border="0" cellpadding="0" cellspacing="0"
     style="width: 100%; height: 100%">
      <tr>
        <td style="height: 200px;background-color: lightgrey;">
          Здесь располагается меню
        </td>
        <td>
          <asp:ContentPlaceHolder ID="CPH2" runat="server">
          </asp:ContentPlaceHolder>
        </td>
      </tr>
    </table>
  </asp:Content>

Страница содержимого ( Default3.aspx ):

<%@ Page Language="C#" MasterPageFile="~/MasterPages/
 Node1MasterPage.master" AutoEventWireup="true"
 CodeFile="Default3.aspx.cs" Inherits="Default3" Title=
 "Untitled Page" %>
<asp:Content ID="Content1" ContentPlaceHolderID="CPH2"
 Runat="Server">
<h3>содержимое вложенной мастер-страницы</h3>
</asp:Content>

В результате выполнения приложения окно браузера будет выглядеть следующим образом:

Результат выполнения приложения, содержащего вложенные мастер-страницы

Рис. 6.14. Результат выполнения приложения, содержащего вложенные мастер-страницы

Краткие итоги

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

В момент обращения пользователя к странице Web-приложения среда ASP.NET осуществляет проверку принадлежности данной страницы к какой-либо мастер-странице. В случае положительного результата страница содержимого получает от мастер-страницы фиксированные элементы и предоставляет дополнительное содержимое. Сформированная таким образом страница передается клиенту для отображения в браузере. Таким образом, мастер-страница не может быть отображена в окне браузера клиента, т. к. она содержит элементы, используемые для формирования страницы содержимого и отправки ее клиенту.

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

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

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