2009-06-02 16 views
7

Ho una pagina master "Master" e ho 2 pagine Master "secondarie". Questi 2 sottotitoli hanno la loro proprietà della pagina principale impostata sulla pagina Master "Master". Tutto bene finora.MasterPage utilizzando Masterpages ed ereditarietà

Bene, oggi mi è stato detto di rendere Sub1 e Sub2 effettivamente "ereditari" dalla pagina Master. Ho pensato che venivano impreciso con il loro linguaggio, ma no, lei voleva me di cambiare la definizione della classe di

public partial class Sub2 : TheMaster 

(quelli non sono i nomi).

Così, ora ho Sub1 e Sub2 che sono le pagine master, e hanno una pagina master di TheMaster, e anche loro sono della classe di "TheMaster"

Sono abbastanza confuso da questo, e non sono sicuro che tipo di effetti avrà questo. Sembra che stia compilando e andando bene adesso, ma stiamo iniziando questo progetto di sei mesi oggi, e non voglio arrivare al mese 5 e scoprire che abbiamo un grosso difetto di progettazione.

Qualcuno può dirmi che questo è del tutto bene, o che siamo completamente incasinato?

Sono spaventato ... stringimi.

MODIFICA: chiarimento: il motivo per cui voleva che ereditassi anche dalla pagina principale è che impostiamo alcune cose in quella pagina e le vogliamo disponibili per le pagine secondarie. Cose come il nodo corrente nella mappa del sito che è la pagina di rendering, alcuni elementi dell'account utente e molto altro ancora.

+0

È un po 'strano che tu abbia una masterpage in una masterpage. La pagina principale contiene in genere i tag principali , e . La tua sub-masterpage contiene anche quelle? – Ropstah

+0

No. La pagina principale contiene tutto ciò che hai menzionato, più un'intestazione e un div footer, che sono costanti su tutto il sito. Sub Master 1 contiene un layout per 3 colonne nel corpo del contenuto e sub master 2 contiene un layout a 2 colonne (e alcune altre cose, davvero) –

risposta

1

Fondamentalmente ciò che è stato fatto è impostare la pagina in modo che la classe erediti tutti gli elementi dalla base specificata. L'hookup della proprietà "Masterpage" crea un'associazione debole e rende il contenuto all'interno di una struttura specifica. La classe che eredita dalla base sposta la logica in avanti, in un modo in cui anziché eseguirla, è possibile ignorarla.

Ora, dopo averci pensato, molto probabilmente non si vuole l'insieme di proprietà MasterPage .... ma solo la classe eredità

+0

Ok, ma perché? E come dovrei specificare le aree di contenuto nella pagina master, e quindi usare quelle aree e specificare le nuove aree di contenuto nelle pagine submaster se non voglio che la proprietà della pagina mastro sia impostata? –

+0

Nel complesso, dipende da cosa si sta tentando di fare, se le pagine secondarie hanno bisogno di sovrascrivere la funzionalità del metodo del genitore, allora ci si trova in una situazione un po 'complicata. Se hai solo bisogno delle informazioni, pubblica gli articoli nella pagina principale e fai riferimento a this.parent per raggiungerli. –

4

è infatti possibile avere pagine master nidificate - vedi http://msdn.microsoft.com/en-us/library/x2b3ktt7.aspx per un riferimento.

EDIT come da commento

Non credo che la tua pagina master sub dovrebbe essere ereditato dalla pagina master principale nel codice dietro.

Ogni pagina master, incluse le pagine secondarie secondarie, deve ereditare direttamente da MasterPage, ovvero public partial class Sub1 : System.Web.UI.MasterPage.

Solo il markup ASP della pagina master secondaria dovrebbe essere riferimento alla pagina master principale, vale a dire <%@ Master Language="C#" MasterPageFile="~/TheMaster.master" ... />

Se si aggiunge il pagina master secondaria al progetto tramite l'interfaccia utente VS, selezionando TheMaster.master come pagina master allora vedrai che questo è come sono state create le cose. L'utilizzo della pagina principale è progettato per essere solo tramite il contenuto (markup) e non tramite l'ereditarietà della classe.

+0

So che è possibile. L'ho dichiarato nel mio post. Ti ho detto come l'ho installato e ho detto come funzionava. Le mie domande riguardavano maggiormente DOVREBBE sia specificare una pagina master che ereditare dalla stessa pagina principale? –

+0

+1 per "L'utilizzo della pagina principale è progettato per essere solo tramite il contenuto (markup) e non tramite l'ereditarietà della classe." Questo mi ha aiutato ad allontanarmi dallo sprecare più tempo nel cercare di adattare la logica di classe alle pagine master. – palswim

2

Ho appena imbattuto in questo, e ha voluto aggiungere problemi specifici si incorrerà in quando eredita da pagine master si sta anche nidificazione. Ad esempio, il codice seguente in BaseMaster.master.cs:

//BaseMaster.master.cs 
public String FooLabelText 
{ 
    get { return FooLabel.Text; } 
    set { FooLabel.Text = value; } 
} 

quando viene chiamato dalla pagina ereditato lancerà un NullReferenceException. FooLabel (un'etichetta nel file BaseMaster.master) non esiste nella pagina principale nidificata (SubMaster.master), quindi se si accede a tale proprietà si interromperà.

Si potrebbe aggirare questo overridding la proprietà nella sottoclasse e riorientare alla pagina master si sta annidato in, ma questo in realtà si rompe la filosofia del design di pagine master .NET:

//SubMaster.master.cs inherits from BaseMaster 
new public String FooLabelText 
{ 
    get { return (Master as BaseMaster).FooLabel.Text; } 
    set { (Master as BaseMaster).FooLabel.Text = value; } 
} 

Si noti che non sto usando base.FooLabel, ma Master.FooLabel, che sta davvero puntando a un oggetto diverso. Nella migliore delle ipotesi, si tratta di un trucco e in molti casi creerà più lavoro e duplicazioni.

Un'alternativa potrebbe essere quella di creare una classe base virtuale della pagina master con la funzionalità dell'applicazione desiderata e di ereditare ciascuna pagina master da questa classe. Posso solo vedere vantaggi molto limitati nell'usare questo usando una classe di base di pagine virtuali e molti aspetti negativi. Probabilmente è meglio usare le pagine master per quello che sono i migliori, ridurre la replica nel markup e mettere il resto delle funzionalità richieste nelle classi di pagine.