2013-03-22 14 views
34

Ho una pagina principale che contiene un'etichetta per i messaggi di stato. Devo impostare il testo di stato da diverse pagine .aspx. Come può essere fatto dalla pagina dei contenuti?come accedere al controllo della pagina mastro dalla pagina di contenuto

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) 
    {    

    } 
} 

Ho provato questo, ma non ha avuto successo nel rendere il lavoro:

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!"); 
       }          
      } 
     } 
    }     
} 
+0

quindi vuoi accedere alla 'proprietà di testo dell'etichetta 'in tutte le tue pagine' aspx' .... giusto? –

+0

sì, questo è in pratica quello che sto cercando di ottenere ... – LeonidasFett

+1

@LeonidasFett: Dovrebbe funzionare, quindi che problema hai? Hai usato il debugger? –

risposta

60

Negli MasterPage.cs il file aggiungere il property di Label come questo:

public string ErrorMessage 
{ 
    get 
    { 
     return lblMessage.Text; 
    } 
    set 
    { 
     lblMessage.Text = value; 
    } 
} 

Sul aspx pagina, appena sotto la direttiva Pagina aggiungere questo:

<%@ Page Title="" Language="C#" MasterPageFile="Master Path Name"..... %> 
<%@ MasterType VirtualPath="Master Path Name" %> // Add this 

E nel tuo codebehind(aspx.cs) pagina è quindi possibile accedere facilmente al Label Property e impostare il suo text come richiesto. Come questo:

this.Master.ErrorMessage = "Your Error Message here"; 
+1

grazie che funziona perfettamente e molto conveniente! – LeonidasFett

+1

cambia il titolo di questa domanda in uno più pertinente. 'come accedere al controllo della pagina principale dalla pagina di contenuto' –

+1

ok ora ho ottenuto una NullReferenceException per l'etichetta nel campo delle proprietà ... Ho caricato il mio nuovo codice sopra. mi sono perso qualcosa qui? – LeonidasFett

3

È cannot use var in a field, solo su variabili locali.

Ma anche questo non funziona:

Site master = Master as Site; 

Poiché non è possibile utilizzare this in un campo e Master as Site è lo stesso di this.Master as Site. Quindi, solo inizializzare il campo dalla Page_Init quando la pagina è completamente inizializzato e si può usare this:

Site master = null; 

protected void Page_Init(object sender, EventArgs e) 
{    
    master = this.Master as Site; 
} 
21

Nella pagina Il contenuto è possibile accedere l'etichetta e impostare il testo come

Qui 'lblStatus' è il tuo padrone dell'etichetta pagina ID

 
Label lblMasterStatus = (Label)Master.FindControl("lblStatus"); 

lblMasterStatus.Text = "Meaasage from content page"; 
+0

E se il master ha un master, devi 'Master.Master'. – toddmo

3

ho un aiutante metodo per questo nella mia 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; 
} 

quindi è possibile accedere utilizzando il codice riportato di seguito.

Label lblStatus = FindControlFromMaster<Label>("lblStatus"); 
if(lblStatus!=null) 
    lblStatus.Text = "something"; 
+0

TAnx un sacco, caro @surya –

5

Funziona

Per trovare i controlli pagina master a pagina Bambino

Label lbl_UserName = this.Master.FindControl("lbl_UserName") as Label;      
lbl_UserName.Text = txtUsr.Text; 
1

Questo è più complicato se si dispone di un MasterPage nidificato. È necessario prima trovare il controllo del contenuto che contiene la MasterPage nidificata, quindi trovare il controllo sulla MasterPage nidificata da quella.

Bit cruciale: Master.Master.

vedere qui: http://forums.asp.net/t/1059255.aspx?Nested+master+pages+and+Master+FindControl

Esempio:

'Trova il controllo dei contenuti

Dim ct Come ContentPlaceHolder = Me.Master.Master.FindControl ("cphMain")

'ora trova controlli all'interno di quel contenuto

Dim lbtnSave As LinkButton = ct. FindControl ("lbtnSave")

+1

Aha! La pagina principale annidata era il mio problema e questo ha fatto il trucco! – madannes