Passage de parametre entre Page et MasterPage
Lorsqu'on travail avec des MasterPage on a souvent besoin de pouvoir dialoguer entre la page et le Master associé. Prenons par exemple le cas d'un label dans le MasterPage, on aimerait pouvoir modifier ce Label dans le code de la page.
La première solution consiste à passer par la méthode FindControl de la propriété Master de l'objet Page :
((Label)Master.FindControl("Label1")).Text = "Modifié depuis la page";
Une autre solution est de passer par une propriété définie dans le Master :
public partial class Divers_MasterPage_MasterPage : System.Web.UI.MasterPage
{
// ...
public String LabelText
{
get { return Label1.Text; }
set {Label1.Text = value;}
}
// ...
}
et dans notre page on peut l'appeller ainsi :
((ASP.divers_masterpage_masterpage_master)Master).LabelText = "Modifié depuis la page";
Je viens de trouver une troisième solution qui est encore plus sympa, la propriété Master de l'objet Page est par défaut de type System.Web.UI.MasterPage mais ASP.net permet de modifier le type de cette propriété lors de la compilation de la page, pour avoir la propriété Master du type de la masterPage qu'on utilise il faut rajouter une directive à la page :
<%@ MasterType VirtualPath="~/Divers/MasterPage/MasterPage.master" %>
On peut alors faire :
Master.LabelText = "modifié depuis la page";
Plutôt sympathique :-) Mais que se passe si on modifie dynamiquement la MasterPage dynamiquement ? Tout se passera bien à la compilation mais lorsque vous essayer d'accéder à la propriété Master une exception de type InvalidCastException va être lancé. Pour palier à ce problème il faut passer par une Abstract Class.
Créons une classe abstraite MasterBase qui hérite de MasterPage
public abstract class MasterBase : MasterPage
{
public abstract String LabelText { get; set; }
}
Héritons maintenant nos différentes MasterPage de MasterBase
public partial class Divers_MasterPage_MasterPage : MasterBase
{
// ...
public override string LabelText
{
get { return Label1.Text; }
set {Label1.Text = value;}
}
// ...
}
Et enfin modifions notre directive page @MasterType
<%@ MasterType TypeName="MasterBase" %>
Ce code fonctionnera alors parfaitement :
public partial class Divers_MasterPage_Default : System.Web.UI.Page
{
protected void Page_PreInit(object sender, EventArgs e)
{
Page.MasterPageFile = "MasterPage2.master";
}
protected void Page_Load(object sender, EventArgs e)
{
Master.LabelText = "modifié depuis la page";
}
}