2009-07-07 14 views

risposta

18

Il modo più semplice è impostare una proprietà sulla pagina principale che gestisca il funzionamento on/off quando chiamato. Quindi nella tua pagina figlio imposta MasterType directive per ottenere un riferimento fortemente tipizzato alla tua pagina mastro per evitare la necessità di eseguire il cast.

tua pagina figlio avrebbe avuto:

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

E di contattare la struttura della pagina master:

Master.MyLabel = false; // or true 

Così il tuo padrone si potrebbe avere:

public bool MyLabel 
{ 
    get 
    { 
     return masterLabel.Enabled; 
    } 
    set 
    { 
     masterLabel.Enabled = value; 
    } 
} 
+0

Marks anser mi ha fatto andare su di esso, ma questa è la risposta è come sono stato in grado di implementarlo. Grazie Ahmad. – Lloyd

+0

Bello. Una cosa che puoi fare è andare nel tuo file .designer.cs e cambiare l'ambito del controllo in pubblico, quindi hai tutte le proprietà per consegnare la tua logica di pagina. Anche se stai esponendo una proprietà pubblica, di solito è meglio usare CamelCase, pascalCase è per campi privati. :) –

+0

@ Marco: buone informazioni! Sono d'accordo sul CamelCase, mi sono perso. Risolto ora. –

3

Ecco un esempio di come comunicare con Pagine master da Pagine figlio.

Nella pagina master, creare una proprietà per il controllo che si desidera accedere, ad esempio un'etichetta chiamata lblUser ...

public string MyProperty 
     { 
     set { lblUser.Text = value; } 
     } 

Nella pagina figlio, accedere alla proprietà appena creato come nel seguente esempio ...

((MyMaster)this.Master).MyProperty = "Text changed from Sub Page"; 

siamo in grado di fare questo perché il Maestro è semplicemente una classe che eredita System.Web.UI.MasterPage.

E la proprietà Label.Text che abbiamo creato è solo una proprietà della classe Master (questo nome sarà il nome specifico della pagina master corrente, in questo caso MyMaster).

Si noti che non funzionerà senza un cast per la specifica classe Master Page e questo è perché è stato aggiunto un campo che non esiste in System.Web.UI.MasterPage, il tipo di questo.Master, ma nel vostro Master Class specifica.

+0

+1 a questo! Come la mia soluzione, solo più elegante! – GenericTypeTea

+0

Semplice e utile. Grazie e meritato un punto. – QMaster

-1
this.Master.FindControl("controlid").dosomethinghere 
+1

-1 codifica nomi dei controlli rigidi come stringhe è male – GenericTypeTea

+0

@GenericTypeTea Questo è quello che fanno nel [documentazione] (https://msdn.microsoft.com/en-us/library/xxwa0ff0 (v = vs.140) aspx) anche se – Zorgarath

10

è necessario utilizzare una direttiva MasterType nella tua pagina markup

<%@ MasterType TypeName="Namespace.Etc.MyMasterPage" %> 

Allora si sarà in grado di accedere a tutte le proprietà pubbliche della pagina master della pagina utilizzando

this.Master.PropertyIWantToIntefereWith... 

Spero che questo aiuta

+0

L'ho fatto attraverso la fusione dell'oggetto Page ... questo suona SOOO molto meglio! Grazie! – CodeRedick

+0

Non è stato chiaro per me dove determinare il valore TypeName, quindi ho utilizzato l'opzione VirtualPath per MasterType e ha funzionato perfettamente. Grazie! – Lloyd

+0

Mai più questo! Grazie Marco +1! – GenericTypeTea

0

I cercavo qualcosa di simile, ma questa soluzione non sembra funzionare per me. Ho una pagina principale annidata. Funziona per un maestro annidato? Quando ho implementato, non riconosce il controllo che ho aggiunto al mio master.

Problemi correlati