• Microsoft .NET
  • ASP.NET
  • Руководство по Catharsis - часть 3: быстрая разработка приложений

Динамическая загрузка мастер-страниц в ASP.NET 3.5

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

Мастер-страница связывается с содержимым страницы на самой ранней стадии жизненного цикла выполнения страницы. Это означает, что вы не можете загрузить мастер-страницу во время события Page Load. Единственн ое событие, во время которого вы можете загрузить мастер-страницу, является событие Page PreInit. Это самое первое событие, вызванное во время цикла выполнения страницы.

<%@ Page Language=”C#” MasterPageFile=”~/Dynamic1.master”  %>
<script runat=”server”>
protected void Page_PreInit(object sender, EventArgs e)
{
 if (Request[“master”] != null)
 {
  switch (Request[“master”])
  {
   case “Dynamic1”:
    Profile.MasterPageFile = “Dynamic1.master”;
    break;
   case “Dynamic2”:
    Profile.MasterPageFile = “Dynamic2.master”;
    break;
  }
 }
 MasterPageFile = Profile.MasterPageFile;
}
</script>
<asp:Content
ID=”Content1”
ContentPlaceHolderID=”ContentPlaceHolder1”
Runat=”Server”>
Select a Master Page:
<ul class=”selectMaster”>
<li>
<a href=”DynamicContent.aspx?master=Dynamic1”>Dynamic Master 1</a>
</li>
<li>
<a href=”DynamicContent.aspx?master=Dynamic2”>Dynamic Master 2</a>
</li>
</ul>
</asp:Content>

Страница содержит две ссылки. Обе ссылки включают в себя параметр строки запроса под названием master, который представляет собой название мастер-страницы. Когда вы нажимаете на первую ссылку, загружается динамическая Dynamic1.master Master страница загружается, и, соответственно, когда вы щелкнете по второй ссылке, то загружается Dynamic2.master Master Page. Заметьте, что страница включает обработчик события Page_PreInit(). Этот обработчик выхватывает значение данного параметра строки master запроса и присваивает значение данного параметра свойству Profile. Далее, значение свойства Profile присваивается MasterPageFile свойству страницы. Присвоение значения свойству MasterPageFile вызывает динамическую загрузку мастер-страницы.

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

<configuration>
<system.web>
<profile>
<properties>
<add
name=”MasterPageFile”
defaultValue=”Dynamic1.master” />
</properties>
</profile>
</system.web>
</configuration>

Динамическая загрузка мастер-страниц для нескольких страниц сайта

В предыдущем разделе вы научились динамически загружать мастер-страницу для одной страницы веб-сайта. Однако, что если вам необходимо динамически загрузить мастер-страницу для каждой страницы вашего веб-сайта? Наиболее легким путем применения такой же логики для нескольких страниц сайта является создание нового базового класса Page.

using System;
using System.Web.UI;
using System.Web.Profile;
public class DynamicMasterPage : Page
{
 protected override void OnPreInit(EventArgs e)
 {
  this.MasterPageFile = (string)Context.Profile[“MasterPageFile”];
  base.OnPreInit(e);
 }
}

Класс DynamicMasterPage является наследником класса Page. Однако он перегружает метод OnPreInit() базового класса Page и добавляет логику динамической загрузки мастер-страницы. После того как вы создадите базовый класс Page, вам необходимо зарегистрировать его в файле веб-конфигурации. Данный файл содержит все необходимые настройки.

<configuration>
<system.web>
<pages pageBaseType=”DynamicMasterPage” />
<profile>
<properties>
<add
name=”MasterPageFile”
defaultValue=”Dynamic1.master” />
</properties>
</profile>
</system.web>
</configuration>

После того, как вы зарегистрируете класс DynamicMasterPage как базовый Page класс, каждая страница в вашем приложении автоматически станет наследником нового базового класса. Каждая страница наследует метод OnPreInit() и динамически загружает мастер-страницу.