Обмен информацией между страницами с содержимым (Content Pages) и мастер–страницами (Master Pages) - Передача информации от страницы к её мастер-странице (Master Page)

ОГЛАВЛЕНИЕ

Передача информации от страницы к её мастер-странице (Master Page)

Мастер-страница может напрямую предоставить свои элементы-управления страницам с содержимым. Чтобы передать метод, просто сделайте его публичным (public) в классе code-behind мастер-страницы:

' VB...
Partial Class MasterPageFiles_Main
   Inherits System.Web.UI.MasterPage

   Public Sub DisplayDataFromPage(ByVal message As String)
      DataFromPage.Text = message
   End Sub

End Class

// C#
public partial class MasterPageFiles_MainCS : System.Web.UI.MasterPage
{
   public void DisplayDataFromPage(string message)
   {
      DataFromPage.Text = message;
   }

}

Здесь DataFromPage это элемент управления Label в декларативной разметке мастер-страницы. Метод DisplayDataFromPage является публичным методом, который может быть вызван со страницы, принадлежащей мастер-странице. Строка, переданная в данный метод, присваивается свойству Text элемента управления Label. Используя данный метод, страница с содержимым может настроить отображаемый текст в элементе DataFromPage Label.

Вдобавок, мастер-страница может передать элемент управления из своего декларативного синтаксиса в качестве свойства, доступного только для чтения (read-only):

' VB...
Partial Class MasterPageFiles_Main
   Inherits System.Web.UI.MasterPage

   Public ReadOnly Property DataFromPageLabelControl() As Label
      Get
         Return Me.DataFromPage
      End Get
   End Property

End Class

// C#
public partial class MasterPageFiles_MainCS : System.Web.UI.MasterPage
{
   public Label DataFromPageLabelControl
   {
      get
      {
         return this.DataFromPage;
      }
   }

}

Чтобы получить доступ из страницы с содержимым к методам или свойствам мастер-страницы, свяжите мастер-страницу при помощи свойства Page.Master. Данное свойство возвращает объект типа MasterPage, так что вам придется осуществить его явное преобразование в соответствующий тип до вызова его методов или связывания со свойствами. В качестве альтернативы, вы можете установить директиву @MasterType, которая добавляет свойство в автоматически сгенерированный код класса ASP.NET code-behind, названный Master, который является тесно связанным с указанной мастер-страницей.

Следующая разметка в файле .aspx страницы с содержимым определяет тип мастер-страницы:

<%@ MasterType VirtualPath="pathToMasterPage" %>  

Добавив данную директиву (и сохранив файл .aspx), вы можете ссылаться на публичные методы и свойства мастер-страницы программным способом в классе code-behind страницы с содержимым, используя Master следующим образом:

' VB...
Partial Class Demos_PassInfoToMasterPage
   Inherits System.Web.UI.Page

   Protected Sub ShowText_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles ShowText.Click
      'Вызов метода DisplayDataFromPage мастер-страницы Main.master
      Master.DisplayDataFromPage(TextToShowInMasterPage.Text)

      ' Опционально: можно сослаться на элемент управления напрямую при помощи свойства DataFromPageLabelControl мастер-страницы
      ' Master.DataFromPageLabelControl.Text = TextToShowInMasterPage.Text
   End Sub
End Class

// C#
public partial class Demos_PassInfoToMasterPageCS : System.Web.UI.Page
{
   protected void ShowText_Click(object sender, EventArgs e)
   {
      // Вызов метода DisplayDataFromPage мастер-страницы Main.master
      Master.DisplayDataFromPage(TextToShowInMasterPage.Text);

      // Опционально: можно сослаться на элемент управления напрямую при помощи свойства DataFromPageLabelControl мастер-страницы
      // Master.DataFromPageLabelControl.Text = TextToShowInMasterPage.Text;
   }
}

Код, рассмотренный здесь, а также доступный в конце данной статьи, был скопирован из страницы, включающей в себя элемент TextBox, названный TextToShowInMasterPage, и элемент Button, названный ShowText. Когда нажимают кнопку ShowText - вызывается метод DisplayDataFromPage, передается значение свойства Text элемента TextBox. (В качестве альтернативы, свойство DataFromPageLabelControl мастер-страницы может быть использовано как ссылка на элемент Label в мастер-странице, где может быть установлено свойство Text.) В конечном счете, ввод текста в TextBox на странице и нажатие кнопки Button в результате обновит вид мастер-страницы, отобразив текст, введенный пользователем.

 

Page.Master против Master
Если вы используете директиву @MasterType для создания ссылки мастер-страницы, строго контролируемой по типу в классе code-behind страницы, то вы должны использовать Master для получения сильно типизированной ссылки. Если ваш код использует Page.Master, то вы получите слабо типизированную ссылку (т.е. тип которой – MasterPage), и тем самым потребуется приведение типов до того, как определенные элементы мастер-страницы будут доступны.