13
1 Proposé par :A BENDAOUD MODULE : PROGRAMMATION DE SITES WEB DYNAMIQUE LEÇON :MASTER PAGE Formateur :A BENDAOUD OFPPT/DRPS/ISGI LAAYOUNE Les Master Pages Prenons l’exemple d’un site composé de trois grandes parties : une bannière en haut, un pied de page comportant notamment le copyright et le corps de la page. Seul le corps change quel que soit la partie du site dans laquelle nous nous trouvons. Au lieu de refaire à chaque page tout notre affichage avec un risque d’oublier ou de changer quelque chose au passage, on va tout simplement créer une Master Page. Voyons ce que c’est et en quoi cela va nous simplifier grandement la tâche. 1. Introduction Une Master Page est en fait une page Web qui va servir de modèle pour les autres pages. Plus exactement, on va définir sur une page quel Master Page (page maître en français) elle va devoir utiliser. Pour que cela puisse fonctionner, la Master Page contient des ContentPlaceHolder avec des ID différents. Ce sont ces conteneurs que le page va remplir. En résumé : une page va pointer vers un modèle qu’elle va utiliser. Dans ce modèle se trouvent un ou plusieurs conteneurs. La page qui a été appelé par l’utilisateur ne fera que remplir le ou les conteneurs avec le code que nous avons spécifié (du moins si nous avons défini un contenu pour le conteneur). Voila pour la partie théorique : passons maintenant à la création et à l’utilisation d’une Master Page. 2. Création et utilisation d’une page maître Pour créer une page maître, faites comme pour rajouter n’importe quel page : clic droit sur le nom du projet, Ajouter, Nouvel Elément. Dans la fenêtre qui s’ouvre (voir image ci - dessous) choisissez Page maître.

Master Page

Embed Size (px)

DESCRIPTION

master page asp

Citation preview

Page 1: Master Page

1 Proposé par :A BENDAOUD

MODULE : PROGRAMMATION DE SITES WEB DYNAMIQUE

LEÇON :MASTER PAGE

Formateur :A BENDAOUD OFPPT/DRPS/ISGI LAAYOUNE

Les Master Pages Prenons l’exemple d’un site composé de trois grandes parties : une bannière en haut, un

pied de page comportant notamment le copyright et le corps de la page. Seul le corps

change quel que soit la partie du site dans laquelle nous nous trouvons. Au lieu de refaire

à chaque page tout notre affichage avec un risque d’oublier ou de changer quelque chose

au passage, on va tout simplement créer une Master Page. Voyons ce que c’est et en

quoi cela va nous simplifier grandement la tâche.

1. Introduction

Une Master Page est en fait une page Web qui va servir de modèle pour les autres pages.

Plus exactement, on va définir sur une page quel Master Page (page maître en français)

elle va devoir utiliser. Pour que cela puisse fonctionner, la Master Page contient des

ContentPlaceHolder avec des ID différents. Ce sont ces conteneurs que le page va

remplir. En résumé : une page va pointer vers un modèle qu’elle va utiliser. Dans ce

modèle se trouvent un ou plusieurs conteneurs. La page qui a été appelé par l’utilisateur

ne fera que remplir le ou les conteneurs avec le code que nous avons spécifié (du moins

si nous avons défini un contenu pour le conteneur). Voila pour la partie théorique :

passons maintenant à la création et à l’utilisation d’une Master Page.

2. Création et utilisation d’une page maître

Pour créer une page maître, faites comme pour rajouter n’importe quel page : clic droit

sur le nom du projet, Ajouter, Nouvel Elément. Dans la fenêtre qui s’ouvre (voir image ci-

dessous) choisissez Page maître.

Page 2: Master Page

2 Proposé par :A BENDAOUD

Vous verrez alors s’ouvrir une page avec ce code ci :

Code par défaut de la page maitre Maitre1.Master

<%@ Master Language="C#" AutoEventWireup="true"

CodeBehind="Maitre1.master.cs" Inherits="WebApplication1.Maitre1" %>

<!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 id="Head1" runat="server">

<title>Page sans titre</title>

<asp:ContentPlaceHolder ID="head" runat="server">

</asp:ContentPlaceHolder>

</head>

<body>

<form id="form2" runat="server">

<div>

<asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">

</asp:ContentPlaceHolder>

</div>

</form>

</body>

</html>

Comme vous pouvez le constater, cette page correspond à une page ASPX normale à la

différence que la directive en haut ne s’appelle pas Page mais Master. Autre chose : Il

contient, par défaut, deux ContentPlaceHolder. Un dans le head et un dans le body pour

être plus exact. Ce sont des conteneurs qui vont nous permettre de placer le code

spécifique à chaque page. On peut donc rajouter depuis n’importe quel page utilisant

cette page maître : des en-têtes (dans le head) et du contenu dans le body. Il est bien

entendu possible de rajouter ses propres ContentPlaceHolder.

La prochaine étape va être de créer notre propre page maître et de l’utiliser dans la page

Default.aspx.

Page 3: Master Page

3 Proposé par :A BENDAOUD

Pour cela voyons d’abord le code de la page maître une fois modifié (les modifications

sont soulignées) :

Code de la page maître

<%@ Master Language="C#" AutoEventWireup="true"

CodeBehind="Maitre1.master.cs" Inherits="WebApplication1.Maitre1" %>

<!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 id="Head1" runat="server">

<title>Page maître</title>

<asp:ContentPlaceHolder ID="head" runat="server" />

</head>

<body>

<form id="form2" runat="server">

<h1>Contenu de la page en cours</h1>

<div style="border:solid 2px black;height: 200px;">

<asp:ContentPlaceHolder ID="Body" runat="server" />

</div>

<p style="border:solid 2px black;">Pied de page

</p>

</form>

</body>

</html>

On a rajouté du HTML et du CSS tout simple. Maintenant voyons comment utiliser notre

page maître comme modèle pour notre page Default.aspx. Sur le plan technique, la page

maître possède déjà le Doctype ainsi que les balises html, head et body. Notre page

Default.aspx n’en a donc pas besoin : il ne lui reste que la directive page. C’est dans

celle-ci que nous allons dire que cette page doit utiliser notre page maître. Pour cela nous

utilisons la propriété MasterPageFile. Il y a une autre propriété qui est Title et qui nous

permet de modifier le titre de la page même s’il a été défini dans la page maître (comme

c’est le cas ici). La directive page doit maintenant ressembler à ceci :

Directive de notre page Default.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs"

Inherits="WebApplication1._Default" MasterPageFile="~/Maitre1.Master"

Title="Test" %>

A partir de maintenant notre page utilise la page maître. On peut d’ailleurs l’afficher.

Voici le résultat :

Page 4: Master Page

4 Proposé par :A BENDAOUD

Cet exemple nous montre bien que l’on n’est pas obligé de mettre du contenu dans la

page maître. Si vous regardez la barre d’adresse vous verrez que la propriété Title de la

page Default.aspx a bien modifié le titre de la page. Maintenant que nous savons utiliser

les pages maîtres dans nos pages, nous allons apprendre à y ajouter du contenu.

3. Ajouter du contenu

Maintenant que c’est un peu plus clair dans vos esprits nous allons voir comment ajouter

du contenu. Pour cela nous avons une page Default.aspx qui va afficher dans le corps de

la page un formulaire qui nous permettra de rentrer notre pseudo. Et une seconde page

qui va récupérer le pseudo et l’afficher. Pour cela on va utiliser la page maître faites plus

haut.

Pour ajouter du contenu au ContentPlaceHolder de la page maître, il va falloir rajouter

une balise spéciale : asp:Content.

Page Default.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs"

Inherits="WebApplication1._Default" MasterPageFile="~/Maitre1.Master"

Title="Test" %>

<asp:Content ID="Content1" ContentPlaceHolderID="Body" Runat="Server">

</asp:Content>

Il y a un ID par défaut sur le Content. Celui-ci n’est pas obligatoire. En revanche on est

obligé de spécifier quel ContentPlaceHolder on va remplir avec la propriété

ContentPlaceHolderId, qui, comme vous le comprenez va prendre comme paramètre l’ID

du ContentPlaceHolder. Ensuite le runat="server" car c’est une balise ASP.NET. C’est à

l’intérieur de cette balise Content que l’on va placer notre code. Bien entendu on peut

mettre plusieurs balise Content pour remplir les différents ContentPlaceHolder qui se

trouvent dans la page maître. Remplissons-le avec notre formulaire.

Page Default.aspx

<asp:Content ID="Content1" ContentPlaceHolderID="Body" Runat="Server">

<asp:Label ID="Pseudo" runat="server" Text="Pseudo" />

<asp:TextBox ID="PseudoBox" runat="server" />

<br />

Page 5: Master Page

5 Proposé par :A BENDAOUD

<asp:Button ID="Valider" runat="server" Text="Envoyer"

OnClick="Envoi_Pseudo" /> </asp:Content>

C# - Page Default.aspx.cs

protected void Envoi_Pseudo(object sender, EventArgs e)

{

Session["Pseudo"] = PseudoBox.Text;

Response.Redirect("GestionFormulaire.aspx");

}

---------------------------------------------------------------------------

------

VB.NET – Page Default.asp.vb

Protected Sub Envoi_Pseudo(ByVal sende As Object, ByVal e As EventArgs)

Session("Pseudo") = PseudoBox.Text

Response.Redirect("GestionFormulaire.aspx")

End Sub

Ensuite faisons la page qui va récupérer le pseudo :

Page GestionFormulaire.aspx

<%@ Page Language="C#" AutoEventWireup="true"

CodeBehind="GestionFormulaire.aspx.cs"

Inherits="WebApplication1.GestionFormulaire"

MasterPageFile="~/Maitre1.Master" Title="Résultat formulaire" %>

<asp:Content ID="Content1" ContentPlaceHolderID="Body" Runat="Server">

<asp:Label ID="PseudoLabel" runat="server" Text="Aucun pseudo" />

</asp:Content>

C# - Page GestionFormulaire.aspx.cs

protected void Page_Load(object sender, EventArgs e)

{

if (Session["Pseudo"] != null)

PseudoLabel.Text = Session["Pseudo"].ToString();

}

---------------------------------------------------------------------------

------

VB.NET – Page GestionFormulaire.aspx.vb

Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)

Handles Me.Load

If Session("Pseudo") <> Nothing Then

PseudoLabel.Text = Session("Pseudo").ToString()

End If

End Sub

Voici un exemple fait avec les deux pages ci-dessus :

Page 6: Master Page

6 Proposé par :A BENDAOUD

Remarque : Si vous définissez du contenu dans un des ContentPlaceHolder, ce contenu

sera pris comme contenu par défaut. C'est-à-dire que si une page utilisant cette page

maître ne possède pas de contenu pour ce ContentPlaceHolder, le contenu par défaut

sera affiché.

4. Lier toutes les pages à une page maître

Nous avons vu comment utiliser une page maître sur une page. Il est aussi possible de

définir au niveau de l’application que toutes les pages utiliseront une page maître. On va

donc utiliser le Web.config qui est, nous le rappelons, le fichier de configuration de notre

application Web, pour définir ceci.

On va créer une balise pages dans le system.web. Voici à quoi cela doit ressembler :

Web.config

<system.web> <pages masterPageFile="~/Maitre1.Master" /> </system.web>

Faites le test : enlevez les propriétés MasterPageFile des deux pages ASPX après avoir

rajouté la balise page dans le Web.config.

5. Modification par code behind

Tout comme une page ASPX on peut utiliser du code behind. Nous allons plus e ndétail

comment gérer cela par rapport aux pages ASPX.

a) Utiliser les propriétés de la page maître dans les autres pages

Pour comprendre cet exemple nous allons faire quelque chose de simple. La page maître

contiendra une TextBox et la page Default.aspx va contenir un bouton et un Label.

Quand on clic sur le bouton on prend la valeur de la TextBox et la place dans le Label.

AccesMaitre.Master

<div>

<asp:TextBox ID="TextBox" runat="server">

</asp:TextBox><br /><br />

<asp:ContentPlaceHolder ID="Body" runat="server">

</asp:ContentPlaceHolder>

Page 7: Master Page

7 Proposé par :A BENDAOUD

</div>

Avec l’accesseur qui permet de récupérer le texte entré dans la TextBox :

AccesMaitre.Master.cs

public string Recuperation

{

get

{

return TextBox.Text;

}

}

---------------------------------------------------------------------------

------

AccesMaitre.Master.vb

Public ReadOnly Property Recuperation() As String

Get

Return TextBox.Text

End Get

End Property

Notre page maître est prête. Il ne reste plus qu’a faire notre page Default.aspx. Pour

pouvoir récupérer la propriété, et donc accéder au texte, il va falloir spécifier dans la

page Default.aspx le chemin vers la propriété (ou les s’il y en a plusieurs). Pour ce faire

nous devons spécifier un chemin virtuel vers la page maître avec la directive MasterType

et sa propriété VirtualPath. Une fois ceci fait on peut récupérer les méthodes de la page

maître grâce à l’objet Master. Pour comprendre un peu mieux voici le code de la page

Default.aspx. Regardez le attentivement pour comprendre son fonctionnement.

Default.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs"

Inherits="WebApplication1._Default" MasterPageFile="~/AccesMaitre.Master"

Title="Test" %>

<%@ MasterType VirtualPath="~/AccesMaitre.Master" %>

<asp:Content ID="Content1" ContentPlaceHolderID="Body" Runat="Server">

<asp:Button ID="Button1" runat="server" Text="Charger le Label"

OnClick="ChargeLabel" />

<asp:Label ID="Label1" runat="server" Text="Vide !">

</asp:Label>

</asp:Content>

Default.aspx.cs

protected void ChargeLabel(object sender, EventArgs e)

{

Label1.Text = Master.Recuperation;

}

---------------------------------------------------------------------------

------

Default.aspx.vb

Protected Sub ChargeLabel(ByVal sender As Object, ByVal e As EventArgs)

Label1.Text = Master.Recuperation

End Sub

Page 8: Master Page

8 Proposé par :A BENDAOUD

Avec cette méthode on peut accéder à n’importe qu’elle propriété de la page maître.

Remarquez qu’il faut quand même que la propriété ou méthode en question soit

publique.

b) Accéder aux contrôles de la page maître

Tout comme on peut accéder aux méthodes et propriétés de la page maître depuis le

code behind d’une autre page, on peut aussi accéder à ses contrôles.

Reprenons l’autre exemple, au lieu d’appeler une méthode de la page maître on va tout

simplement accéder au contrôle TextBox et récupérer son texte. Pour faire cela nous

n’avons pas besoin de chemin virtuel comme nous avions eu besoin pour accéder aux

méthodes. Voici ce que va contenir notre évènement clic du bouton de Default.aspx.

Default.aspx.cs

protected void ChargeLabel(object sender, EventArgs e)

{

Label1.Text = ((TextBox)Master.FindControl("TextBox")).Text;

}

---------------------------------------------------------------------------

------

Default.aspx.vb

Protected Sub ChargeLabel(ByVal sender As Object, ByVal e As EventArgs)

Label1.Text = CType(Master.FindControl("TextBox"), TextBox).Text

End Sub

Avec cette façon d’écrire et dans ce cas on obtient le même résultat qu’avec un

accesseur. Mais c’est utile dans d’autre cas.

6. Imbrication des pages maître

Tout comme un conteneur peut contenir un autre conteneur, une page maitre peut en

contenir une autre. L’utilité est que lorsque que nous de allons avoir une partie du site

légèrement différente du reste (par exemple il faut un menu à gauche), et bien il suffira

d’avoir une page maître qui se base sur la première et ne fait que rajouter le menu. Ceci

est un exemple parmi tant d’autres possibles bien sur.

Pour ce qui est de la technique, cela n’est pas plus compliqué que d’utiliser une page

maitre avec un page aspx. C'est-à-dire que le seconde page maître aura une balise

Content, par exemple sur le ContentPlaceHolder nommé Body plus haut. Et que dans ce

Content nous aurons un ContentPlaceHolder qui se situera à droite de la page et un

menu (par exemple une liste dans un div). Ainsi la partie du site qui a besoin d’un menu

va utiliser la seconde page maître (que nous nommerons AffichMenu.Master).

Voici ce que cela donne :

Principale.Master

<%@ Master Language="C#" AutoEventWireup="true"

CodeBehind="Principale.master.cs" Inherits="WebApplication1.Principale" %>

Page 9: Master Page

9 Proposé par :A BENDAOUD

<!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 id="Head1" runat="server">

<title>Page sans titre</title>

<asp:ContentPlaceHolder ID="head" runat="server">

</asp:ContentPlaceHolder>

</head>

<body>

<form id="form2" runat="server">

<div>

<h1>Page Principale</h1>

<div style="border: solid black 2px; padding: 10px;">ContentPlaceHolder :

Body <asp:ContentPlaceHolder ID="Body" runat="server">

</asp:ContentPlaceHolder>

</div>

</div>

</form>

</body>

</html>

AffichMenu.Master

<%@ Master Language="C#" AutoEventWireup="true"

MasterPageFile="~/Principale.Master" CodeBehind="AffichMenu.master.cs"

Inherits="WebApplication1.AffichMenu" %>

<asp:Content ID="Content1" runat="server" ContentPlaceHolderID="Body">

<div style="height: 300px; border: solid black 2px;">Content : Body

<div style="height: 200px; border: solid 2px green; float: left;">

<ul>

<li>Lien 1</li>

<li>Lien 2</li>

<li>Lien 3</li>

<li>Lien 4</li>

</ul>

</div>

<div> <asp:ContentPlaceHolder ID="Body2" runat="server" />

</div>

</div>

</asp:Content>

Default.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs"

Inherits="WebApplication1._Default" MasterPageFile="~/AffichMenu.Master"

Title="Test" %>

<asp:Content ID="Content1" ContentPlaceHolderID="Body2" Runat="Server">

Contenu de Default.aspx<br />

Voici comment on ajoute un menu pour certaines pages

</asp:Content>

Page 10: Master Page

10 Proposé par :A BENDAOUD

Regardez bien le code de la page AffichMenu.Master. C’est lui le plus important. Vous

voyez qu’il ressemble beaucoup à une page aspx qui utiliserait une page maître avec

juste la directive qui reste Master. Elle comporte aussi un Content pour remplir le Body.

Dedans on défini l’architecture de notre page et on remet un ContentPlaceHolder à

l’endroit où l’on veut que le contenu de la page se place. Le reste (l’affichage, les

bordures, couleurs …) est du CSS simple. Vous pouvez voir si dessous un aperçu de ce

que l’on obtient sur le navigateur.

Attention : Les ContentPlaceHolder de la première page maître sont TOUS remplacé par

le contenu de la balise Content leur correspondant dans la seconde page maître et cela

même s’il n’y a rien. Ainsi si vous faites un page maître avec un ContentPlaceHolder

nommé BodyContent et qui contiendra les données spécifiques à chaque page, une fois

votre seconde page maître passé ce ContentPlaceHolder n’existera plus. On ne pourra

donc pas, depuis une page qui utilise la seconde page maître, ajouter les données

principales. Pour contourner cela il faut tout simplement redéfinir ce ContentPlaceHolder :

Première page maître

<asp:ContentPlaceHolder runat="server" ID="BodyContent" />

Seconde page maître – Redéfinition de BodyContent

<asp:Content ID="Content1" runat="server"

ContentPlaceHolderID="BodyContent"> <asp:ContentPlaceHolder runat="server"

ID="BodyContent" />

</asp:Content>

Une fois ceci fais, vous pourrez faire appel au ContentPlaceHolder BodyContent depuis

votre page ASPX.

Page 11: Master Page

11 Proposé par :A BENDAOUD

7. Changer dynamiquement de page maître

Il est intéressant de pouvoir proposer plusieurs affichages différents de notre site aux

utilisateurs. Pour cela il suffit tout simplement de changer de page maître. Le contenu

restera le même mais l’affichage lui changera. Ainsi on peut facilement changer

complètement la façon d’afficher le site mais les données resteront les mêmes. Seul

problème : comment savoir quel page maître l’utilisateur veut utiliser sans avoir à lui

redemander à chaque page. Et bien pour cela reportez-vous au chapitre sur la Gestion

d’état qui traite les sessions, les cookies, les variables dans les url, les champs cachés … .

Autant de manières différentes pour stocker cette donnée. Dans notre cas on va

simplement utiliser la session.

Une chose importante à savoir pour pouvoir changer dynamiquement la page maître,

c’est que l’on peut le faire depuis le code behind avec l’accesseur MasterPageFile de

l’objet Page. Plus important encore : quand peut-on modifier la page maître ? ET bien on

connait le cycle de la page. En sachant cela on remarque qu’on ne peut modifier la page

maître qu’a l’évènement PreInit.

On garde AffichMenu.Master et on ajoute cela :

AffichMenuDroite.Master

<%@ Master Language="C#" AutoEventWireup="true"

CodeBehind="AffichMenuDroite.master.cs"

MasterPageFile="~/Principale.Master"

Inherits="WebApplication1.AffichMenuDroite" %>

<asp:Content ID="Content1" runat="server" ContentPlaceHolderID="Body">

<div style="height: 300px; border: solid black 2px;">Content : Body

<div style="height: 200px; border: solid 2px green; float: right;">

<ul>

<li>Lien 1</li>

<li>Lien 2</li>

<li>Lien 3</li>

<li>Lien 4</li>

</ul>

</div>

<div>

<asp:ContentPlaceHolder ID="Body2" runat="server" />

</div>

</div>

</asp:Content>

Default.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs"

Inherits="WebApplication1._Default" MasterPageFile="~/AffichMenu.Master"

Title="Test" %>

<asp:Content ID="Content1" ContentPlaceHolderID="Body2" Runat="Server">

Choisissez votre Master Page : <br />

<asp:ListBox ID="ListBox1" runat="server" >

<asp:ListItem Text="AffichMenuGauche.Master" Value="Gauche" />

<asp:ListItem Text="AffichMenuDroite.Master" Value="Droite" />

</asp:ListBox><br /> <asp:Button ID="Button1" runat="server" Text="Button"

OnClick="ChangerMaster" />

Page 12: Master Page

12 Proposé par :A BENDAOUD

</asp:Content>

Default.aspx.cs

public partial class _Default : System.Web.UI.Page

{

protected void Page_PreInit(object sender, EventArgs e)

{

if (Session["Master"] != null)

{

if (Session["Master"].ToString() == "Gauche")

MasterPageFile = "AffichMenu.Master";

if (Session["Master"].ToString() == "Droite")

MasterPageFile = "AffichMenuDroite.Master";

}

}

protected void ChangerMaster(object sender, EventArgs e)

{

Session["Master"] = ListBox1.SelectedValue;

Response.Redirect("Default.aspx");

}

}

---------------------------------------------------------------------------

------

Default.aspx.vb

Protected Sub Page_PreInit(ByVal sender As Object, ByVal e As EventArgs)

Handles Me.PreInit

If Session("Master") <> Nothing Then

If Session("Master").ToString() = "Gauche" Then

MasterPageFile = "AffichMenu.Master"

End If

If Session("Master").ToString() = "Droite" Then

MasterPageFile = "AffichMenuDroite.Master"

End If

End If

End Sub

Protected Sub ChangerMaster(ByVal sender As Object, ByVal e As EventArgs)

Session("Master") = ListBox1.SelectedValue

Response.Redirect("Default.aspx")

End Sub

Voici ce que cela donne après avoir choisi le menu à droite et avoir appuyé sur le bouton

:

Page 13: Master Page

13 Proposé par :A BENDAOUD