Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Aggiornamento: novembre 2007
È possibile eseguire a livello di codice una serie di attività comuni relative alle pagine master, incluse le seguenti:
Accesso ai membri definiti nella pagina master, che possono essere costituiti da proprietà e metodi pubblici o da controlli.
Collegamento dinamico di pagine master a una pagina di contenuto.
Accesso ai membri nella pagina master
Per consentire l'accesso ai membri della pagina master, la classe Page espone una proprietà Master. Per accedere ai membri di una specifica pagina master da una pagina di contenuto, è possibile creare un riferimento fortemente tipizzato alla pagina master definendo una direttiva @ MasterType. Questa direttiva consente di puntare a una pagina master specifica. Quando la pagina crea la proprietà Master, quest'ultima viene tipizzata in base alla pagina master a cui viene fatto riferimento.
Si supponga, ad esempio, di avere una pagina master a cui è assegnato il nome MasterPage.master, che corrisponde al nome della classe MasterPage_master. È possibile creare direttive @ Page e @ MasterType simili alle seguenti:
<%@ Page masterPageFile="~/MasterPage.master"%>
<%@ MasterType virtualPath="~/MasterPage.master"%>
Quando si utilizza una direttiva @ MasterType, come quella dell'esempio, è possibile fare riferimento ai membri della pagina master come illustrato di seguito:
CompanyName.Text = Master.CompanyName
CompanyName.Text = Master.CompanyName;
La proprietà Master della pagina è già tipizzata in base a MasterPage_master.
Recupero dei valori dei controlli nella pagina master
In fase di esecuzione, la pagina master viene unita alla pagina di contenuto affinché i controlli nella pagina master siano accessibili al codice della pagina di contenuto. Se la pagina master contiene controlli in un oggetto ContentPlaceHolder, tali controlli non saranno accessibili in caso di override da parte di un controllo Content della pagina di contenuto. I controlli non sono accessibili direttamente come membri della pagina master perché sono protetti. È tuttavia possibile utilizzare il metodo FindControl per individuare controlli specifici nella pagina master. Se il controllo a cui si desidera accedere si trova all'interno di un controllo ContentPlaceHolder nella pagina master, è necessario innanzitutto ottenere un riferimento a ContentPlaceHolder e quindi chiamare il relativo metodo FindControl per ottenere un riferimento al controllo.
Nell'esempio riportato di seguito viene illustrato come ottenere un riferimento ai controlli nella pagina master. Uno dei controlli a cui viene fatto riferimento si trova all'interno di un controllo ContentPlaceHolder, mentre l'altro no.
' Gets a reference to a TextBox control inside a ContentPlaceHolder
Dim mpContentPlaceHolder As ContentPlaceHolder
Dim mpTextBox As TextBox
mpContentPlaceHolder = _
CType(Master.FindControl("ContentPlaceHolder1"), _
ContentPlaceHolder)
If Not mpContentPlaceHolder Is Nothing Then
mpTextBox = CType(mpContentPlaceHolder.FindControl("TextBox1"), _
TextBox)
If Not mpTextBox Is Nothing Then
mpTextBox.Text = "TextBox found!"
End If
End If
' Gets a reference to a Label control that is not in a
' ContentPlaceHolder control
Dim mpLabel As Label
mpLabel = CType(Master.FindControl("masterPageLabel"), Label)
If Not mpLabel Is Nothing Then
Label1.Text = "Master page label = " + mpLabel.Text
End If
// Gets a reference to a TextBox control inside a ContentPlaceHolder
ContentPlaceHolder mpContentPlaceHolder;
TextBox mpTextBox;
mpContentPlaceHolder =
(ContentPlaceHolder)Master.FindControl("ContentPlaceHolder1");
if(mpContentPlaceHolder != null)
{
mpTextBox = (TextBox) mpContentPlaceHolder.FindControl("TextBox1");
if(mpTextBox != null)
{
mpTextBox.Text = "TextBox found!";
}
}
// Gets a reference to a Label control that is not in a
// ContentPlaceHolder control
Label mpLabel = (Label) Master.FindControl("masterPageLabel");
if(mpLabel != null)
{
Label1.Text = "Master page label = " + mpLabel.Text;
}
È possibile accedere al contenuto dei controlli ContentPlaceHolder della pagina master utilizzando il metodo FindControl, come illustrato sopra. Se il controllo ContentPlaceHolder è stato unito al contenuto di un controllo Content, anziché il contenuto predefinito il controllo ContentPlaceHolder includerà il testo e i controlli definiti nella pagina di contenuto.
Collegamento dinamico di pagine master
Oltre a specificare una pagina master in modo dichiarativo, ovvero nella direttiva @ Page o nel file di configurazione, è possibile collegare una pagina master a una pagina di contenuto in modo dinamico. Poiché la pagina master e la pagina di contenuto vengono unite durante la fase di inizializzazione dell'elaborazione delle pagine, è necessario che venga assegnata una pagina master prima di tale fase. La pagina master viene in genere assegnata in modo dinamico durante la fase PreInit, come nel seguente esempio:
Sub Page_PreInit(ByVal sender As Object, ByVal e As EventArgs) _
Handles Me.PreInit
Me.MasterPageFile = "~/NewMaster.master"
End Sub
void Page_PreInit(Object sender, EventArgs e)
{ this.MasterPageFile = "~/NewMaster.master";
}
Tipizzazione forte per pagine master dinamiche
Se la pagina di contenuto assegna un tipo forte alla pagina master utilizzando una direttiva @ MasterType, il tipo deve essere applicato a qualsiasi pagina master assegnata in modo dinamico. Se si desidera selezionare una pagina master in modo dinamico, si consiglia di creare una classe base dalla quale derivano le pagine master. La classe base delle pagine master può quindi definire le proprietà e i metodi comuni a tutte le pagine master. Quando nella pagina di contenuto si assegna un tipo forte alla pagina master utilizzando una direttiva @ MasterType, è possibile eseguire l'assegnazione alla classe base anziché a una singola pagina master.
Negli esempi riportati di seguito viene illustrato come creare un tipo base per pagine master utilizzabile da più pagine master. In questi esempi vengono utilizzati un tipo base derivato dal controllo MasterPage, due pagine master che ereditano dal tipo base e una pagina di contenuto che consente agli utenti di selezionare una pagina master in modo dinamico utilizzando una stringa di query (?color=green). Il tipo base delle pagine master definisce una proprietà denominata MyTitle. Una delle pagine master esegue l'override della proprietà MyTitle. La pagina di contenuto visualizza la proprietà MyTitle come titolo della pagina. In questo modo, il titolo varierà in base alla pagina master selezionata.
Di seguito è riportato il tipo base delle pagine master. È memorizzato nella directory App_Code.
Public Class BaseMaster
Inherits MasterPage
Public Overridable ReadOnly Property MyTitle() As String
Get
Return "BaseMaster Title"
End Get
End Property
End Class
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public class BaseMaster : System.Web.UI.MasterPage
{
public virtual String MyTitle
{
get { return "BaseMaster Title"; }
}
}
Di seguito è riportata la prima pagina master, che viene visualizzata con uno sfondo blu. Si noti che l'attributo Inherits nella direttiva @ Master fa riferimento al tipo base.
<%@ Master Language="VB" Inherits="BaseMaster"
ClassName="MasterBlue" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<script >
' No property here that overrrides the MyTitle property of the base master.
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head >
<title>No title</title>
</head>
<body>
<form id="form1" >
<div style="background-color:LightBlue">
<asp:contentplaceholder id="ContentPlaceHolder1"
>
Content from MasterBlue.
</asp:contentplaceholder>
</div>
</form>
</body>
</html>
<%@ Master Language="C#" Inherits="BaseMaster"
ClassName="MasterBlue" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<script >
// No property here that overrrides the MyTitle property of the base master.
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" >
<title>No title</title>
</head>
<body>
<form id="form1" >
<div style="background-color:LightBlue">
<asp:contentplaceholder id="ContentPlaceHolder1"
>
Content from MasterBlue.
</asp:contentplaceholder>
</div>
</form>
</body>
</html>
Di seguito è riportata la seconda pagina master, che è identica alla prima, fatta eccezione per il fatto che lo sfondo è verde e che viene eseguito l'override della proprietà MyTitle definita nel tipo base.
<%@ Master Language="VB" Inherits="BaseMaster"
ClassName="MasterGreen" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<script >
Public Overrides ReadOnly Property MyTitle() As String
Get
Return "MasterGreen Title"
End Get
End Property
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head >
<title>No title</title>
</head>
<body>
<form id="form1" >
<div style="background-color:LightGreen">
<asp:contentplaceholder id="ContentPlaceHolder1" >
Content from MasterGreen.
</asp:contentplaceholder>
</div>
</form>
</body>
</html>
<%@ Master Language="C#" Inherits="BaseMaster"
ClassName="MasterGreen" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<script >
public override String MyTitle
{
get { return "MasterGreen Title"; }
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" >
<title>No title</title>
</head>
<body>
<form id="form1" >
<div style="background-color:LightGreen">
<asp:contentplaceholder id="ContentPlaceHolder1"
>
Content from MasterGreen.
</asp:contentplaceholder>
</div>
</form>
</body>
</html>
Di seguito è riportata la pagina di contenuto, che consente agli utenti di selezionare una pagina master in base a una stringa di query fornita con la richiesta. La direttiva @ MasterType, che assegna un tipo forte alla proprietà Master della pagina, fa riferimento al tipo base.
<%@ Page Language="VB" Title="Content Page" MasterPageFile="~/MasterBlue.master"%>
<%@ MasterType TypeName="BaseMaster" %>
<script >
Protected Sub Page_PreInit(ByVal sender As Object,
ByVal e As System.EventArgs)
Me.MasterPageFile = "MasterBlue.master"
If Request.QueryString("color") = "green" Then
Me.MasterPageFile = "MasterGreen.master"
End If
Me.Title = Master.MyTitle
End Sub
</script>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
Content from Content page.
</asp:Content>
<%@ Page Language="C#" Title="Content Page" MasterPageFile="~/MasterBlue.master"%>
<%@ MasterType TypeName="BaseMaster" %>
<script >
protected void Page_PreInit(Object sender, EventArgs e)
{
this.MasterPageFile = "MasterBlue.master";
if(Request.QueryString["color"] == "green")
{
this.MasterPageFile = "MasterGreen.master";
}
this.Title = Master.MyTitle;
}
</script>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1"
Runat="Server">
Content from Content page.
</asp:Content>