J'ai une page maître qui contient une étiquette pour les messages d'état. Je dois définir le texte d'état à partir de différentes pages .aspx. Comment cela peut-il être fait à partir de la page de contenu?
public partial class Site : System.Web.UI.MasterPage
{
public string StatusNachricht
{
get
{
return lblStatus.Text;
}
set
{
lblStatus.Text = value;
}
}
protected void Page_Load(object sender, EventArgs e)
{
}
}
J'ai essayé ceci, mais je n'ai pas réussi à le faire fonctionner:
public partial class DatenAendern : System.Web.UI.Page
{
var master = Master as Site;
protected void Page_Load(object sender, EventArgs e)
{
if (master != null)
{
master.setStatusLabel("");
}
}
protected void grdBenutzer_RowCommand(object sender, GridViewCommandEventArgs e)
{
try
{
//some code
if (master != null)
{
master.setStatusLabel("Passwort erfolgreich geändert.");
}
}
catch (Exception ex)
{
if (master != null)
{
master.setStatusLabel("Passwort konnte nicht geändert werden!");
}
}
}
}
}
Dans le fichier MasterPage.cs, ajoutez la property
de Label
comme ceci:
public string ErrorMessage
{
get
{
return lblMessage.Text;
}
set
{
lblMessage.Text = value;
}
}
Sur votre page aspx
, juste en dessous de la directive Page, ajoutez ceci:
<%@ Page Title="" Language="C#" MasterPageFile="Master Path Name"..... %>
<%@ MasterType VirtualPath="Master Path Name" %> // Add this
Et dans votre page codebehind(aspx.cs)
, vous pouvez ensuite accéder facilement au Label Property
et définir sa text
selon vos besoins. Comme ça:
this.Master.ErrorMessage = "Your Error Message here";
Dans la page Contenu, vous pouvez accéder à l'étiquette et définir le texte tel que
Ici 'lblStatus' est l'identifiant d'étiquette de votre maquette
Label lblMasterStatus = (Label) Master.FindControl ("lblStatus"); LblMasterStatus.Text = "Mesure de la page de contenu";
Ça marche
Pour rechercher des contrôles de page maître sur la page enfant
Label lbl_UserName = this.Master.FindControl("lbl_UserName") as Label;
lbl_UserName.Text = txtUsr.Text;
J'ai une méthode d'assistance pour cela dans ma classe System.Web.UI.Page
protected T FindControlFromMaster<T>(string name) where T : Control
{
MasterPage master = this.Master;
while (master != null)
{
T control = master.FindControl(name) as T;
if (control != null)
return control;
master = master.Master;
}
return null;
}
alors vous pouvez accéder en utilisant le code ci-dessous.
Label lblStatus = FindControlFromMaster<Label>("lblStatus");
if(lblStatus!=null)
lblStatus.Text = "something";
Vous ne pouvez pas utiliser var
dans un champ , uniquement sur des variables locales.
Mais même cela ne fonctionnera pas:
Site master = Master as Site;
Parce que vous ne pouvez pas utiliser this
dans un champ et que Master as Site
est identique à this.Master as Site
. Donc, initialisez le champ à partir de Page_Init
lorsque la page est complètement initialisée et vous pouvez utiliser this
:
Site master = null;
protected void Page_Init(object sender, EventArgs e)
{
master = this.Master as Site;
}
Ceci est plus compliqué si vous avez une page maître imbriquée. Vous devez d'abord rechercher le contrôle de contenu qui contient la MasterPage imbriquée, puis rechercher le contrôle sur votre MasterPage imbriquée à partir de celui-ci.
Bit crucial: Master.Master.
Voir ici: http://forums.asp.net/t/1059255.aspx?Nested+master+pages+and+Master+FindControl
Exemple:
'Trouver le contrôle de contenu
Dim ct As ContentPlaceHolder = Me.Master.Master.FindControl ("cphMain")
'maintenant trouver des contrôles à l'intérieur de ce contenu
Dim lbtnSave As LinkButton = ct.FindControl ("lbtnSave")
Si vous essayez d'accéder à un élément html: il s'agit d'une ancre HTML ...
Ma barre de navigation contient des éléments qui ne sont pas des éléments de liste (<li>
) mais plutôt des ancres html (<a>
).
Voir ci-dessous: (Ceci est le maître du site)
<nav class="mdl-navigation">
<a class="mdl-navigation__link" href="" runat="server" id="liHome">Home</a>
<a class="mdl-navigation__link" href="" runat="server" id="liDashboard">Dashboard</a>
</nav>
Maintenant dans votre code derrière pour une autre page, pour le mien, c'est la page de connexion ...
Sur PageLoad (), définissez ceci:
HtmlAnchor lblMasterStatus = (HtmlAnchor)Master.FindControl("liHome");
lblMasterStatus.Visible =false;
HtmlAnchor lblMasterStatus1 = (HtmlAnchor)Master.FindControl("liDashboard");
lblMasterStatus1.Visible = false;
Nous avons maintenant accédé aux contrôles des maîtres de site et les avons rendus invisibles sur la page de connexion.