Utilisation des pages maîtres ASP.NET par programme
Mise à jour : novembre 2007
Vous pouvez exécuter par programme plusieurs tâches courantes avec les pages maîtres, notamment :
accéder aux membres définis dans la page maître, pouvant se composer de propriétés et de méthodes ou contrôles publics ;
attacher de manière dynamique de pages maîtres à une page de contenu.
Accès aux membres de la page maître
Pour donner accès aux membres de la page maître, la classe Page expose une propriété Master. Pour accéder aux membres d'une page maître spécifique à partir d'une page de contenu, vous pouvez créer une référence fortement typée à la page maître en créant une directive @ MasterType. La directive vous permet de pointer vers une page maître spécifique. Lorsque la page crée sa propriété Master, cette dernière est du type de la page maître référencée.
Par exemple, vous pouvez avoir une page maître nommée MasterPage.master qui est le nom de classe MasterPage_master. Vous pouvez créer des directives @ Page et @ MasterType qui se présentent comme suit :
<%@ Page masterPageFile="~/MasterPage.master"%>
<%@ MasterType virtualPath="~/MasterPage.master"%>
Lorsque vous utilisez une directive @ MasterType, telle que celle mentionnée dans l'exemple, vous pouvez référencer des membres de la page maître comme dans l'exemple suivant :
CompanyName.Text = Master.CompanyName
CompanyName.Text = Master.CompanyName;
La propriété Master de la page est déjà du type de MasterPage_master.
Obtention des valeurs de contrôles de la page maître
Au moment de l'exécution, la page maître étant fusionnée avec la page de contenu, les contrôles de la page maître sont accessibles au code de la page de contenu. (Si la page maître contient des contrôles dans un contrôle ContentPlaceHolder, ces contrôles ne sont pas accessibles s'ils sont substitués par un contrôle Content de la page de contenu). Les contrôles ne sont pas directement accessibles comme membres de la page maître parce qu'ils sont protégés. Toutefois, vous pouvez utiliser la méthode FindControl pour localiser des contrôles spécifiques de la page maître. Si le contrôle auquel vous souhaitez accéder est contenu dans un contrôle ContentPlaceHolder de la page maître, vous devez d'abord obtenir une référence au contrôle ContentPlaceHolder, puis appeler sa méthode FindControl pour obtenir une référence au contrôle.
L'exemple suivant montre comment vous pouvez obtenir une référence aux contrôles de la page maître. L'un des contrôles référencés se trouve dans un contrôle ContentPlaceHolder et l'autre ne s'y trouve pas.
' 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;
}
Vous pouvez accéder au contenu des contrôles ContentPlaceHolder de la page maître en utilisant la méthode FindControl, comme indiqué ci-dessus. Si le contrôle ContentPlaceHolder a été fusionné avec le contenu d'un contrôle Content, le contrôle ContentPlaceHolder ne contiendra pas son contenu par défaut. À la place, il contiendra le texte et les contrôles définis dans la page de contenu.
Attachement dynamique de pages maîtres
Outre la spécification d'une page maître de manière déclarative (dans la directive @ Page ou dans le fichier de configuration), vous pouvez attacher dynamiquement une page maître à une page de contenu. La page maître et la page de contenu étant fusionnées pendant l'étape d'initialisation du traitement de la page, une page maître doit être assignée au préalable. Vous assignez généralement de manière dynamique une page maître pendant l'étape PreInit, comme dans l'exemple suivant :
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";
}
Typage fort des pages maîtres dynamiques
Si la page de contenu assigne un type fort à la page maître en utilisant une directive @ MasterType, le type doit s'appliquer à toute page maître que vous assignez de manière dynamique. Si vous avez l'intention de sélectionner une page maître de manière dynamique, il est recommandé de créer une classe de base d'où dérivent vos pages maîtres. La classe de page maître de base peut alors définir les propriétés et les méthodes que les pages maîtres ont en commun. Dans la page de contenu, lorsque vous assignez un type fort à la page maître en utilisant une directive @ MasterType, vous pouvez l'assigner à la classe de base au lieu de l'assigner à une page maître individuelle.
Les exemples suivants montrent comment créer un type de page maître de base qui peut être utilisé par plusieurs pages maîtres. Les exemples se composent d'un type de base qui est dérivé du contrôle MasterPage, de deux pages maîtres qui héritent du type de base et d'une page de contenu qui permet aux utilisateurs de sélectionner dynamiquement une page maître en utilisant une chaîne de requête (?color=green). Le type de page maître de base définit une propriété nommée MyTitle. L'une des pages maîtres substitue la propriété MyTitle, mais pas l'autre. La page de contenu affiche la propriété MyTitle comme titre de la page. Le titre de la page variera par conséquent en fonction de la page maître sélectionnée.
Il s'agit du type de page maître de base. Il appartient au répertoire 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"; }
}
}
Il s'agit de la première page maître qui affiche un arrière-plan bleu. Notez que l'attribut Inherits dans la directive @ Master fait référence au type de 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>
Il s'agit de la seconde page maître. Elle est identique à la première page maître, mais elle affiche un arrière-plan vert et elle substitue la propriété MyTitle qui est définie dans le type de 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>
Il s'agit de la page de contenu qui permet aux utilisateurs de sélectionner une page maître en fonction d'une chaîne de requête fournie avec la demande. La directive @ MasterType qui assigne un type fort à la propriété Master de la page fait référence au type de 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>