2009-02-24 31 views

risposta

9

Appena testato questo e funziona dalla PreInit della pagina che utilizza la MasterPage nidificata.

protected void Page_PreInit(object sender, EventArgs e) 
{ 
    this.Master.MasterPageFile = "/Site2.Master"; 
} 

Ovviamente è necessario per garantire che i ContentPlaceholderIds siano coerenti tra le pagine che si stanno scambiando tra.

+0

Hmm sì, questa è una soluzione. Sfortunatamente ciò significa inserire il codice in ogni pagina che utilizza la pagina Master piuttosto che in un unico posto. Non sono sicuro quale sia il minore dei due mali ... copiare la Pagina Master in modo che ci siano due copie sarebbe molto meno lavoro! –

3

Uniamo il metodo di Andy con una classe "BasePage": creiamo una classe che eredita da System.Web.UI.Page e quindi tutte le nostre pagine ereditano da questa classe.

Quindi, nella nostra classe di pagina di base, possiamo eseguire i controlli rilevanti per vedere quale pagina principale di root deve essere usata - nel nostro caso abbiamo un master "Presentation" e un master "Authoring" - la versione di presentazione ha tutta la navigazione e l'arredamento delle pagine, insieme al pesante display CSS, mentre il master di authoring ha qualche JS extra per gli strumenti di authoring, un CSS più leggero e nessuna navigazione (è ciò che usiamo quando l'utente sta effettivamente creando una pagina, piuttosto che modificare il layout del sito).

Questa pagina di base può quindi chiamare Page.Master.MasterPageFile e impostarlo sul master di authoring se questo è lo stato corretto per la pagina.

2

Solo nel caso qualcuno si imbatte in questo e strappa i capelli con un "controlli contenuti devono essere i controlli di primo livello in una pagina di contenuto o di una pagina master nidificata che fa riferimento a una pagina master" errore quando si tenta il codice di Andy , sbarazzarsi di this.Master. Quindi, il codice diventa:

protected void Page_PreInit(object sender, EventArgs e) 
{ 
    MasterPageFile = "/Site2.Master"; 
} 

Modifica Come Zhaph sottolinea di seguito, il codice che ho ^^ ci cambia solo il comandante della pagina corrente, non è padrone del padrone. Questo è il codice di cui parlava Hainesy quando ha menzionato "sappiamo tutti di cambiare dinamicamente una pagina master" (che non ho, d'oh). Se vi capita di accedere a questa pagina googling "masteroverflow change page" (che è quello che ho fatto) allora questo è probabilmente il codice che state cercando :-)

+0

Ma questo cambierà solo la pagina principale interna, e non quella esterna, che è ciò che Hainesy voleva. Direi che hai un problema con un master esterno che non ha tutti i segnaposto necessari per il master interno. –

+0

Ah, gotcha.Ho avuto la parte sbagliata del bastone su questo, mi dispiace. Ho avuto la pagina standard di serie con un master, piuttosto che un master annidato. Questo mi insegnerà a leggere e pensare prima :-) –

+0

Nessun problema, +1 per la modifica :) –

0

Per aggiungere alla risposta di Zhaph - Ben Duguid, (+1 tra l'altro):

Ecco un esempio di codice che imposta la pagina principale della pagina principale nidificata. Tutte le pagine ereditano da questa BasePag, quindi questo codice esiste solo in un posto.

public class BasePage : System.Web.UI.Page 
{ 
    private void Page_PreInit(object sender, System.EventArgs e) 
    { 
     if (Request.Browser.IsMobileDevice) 
     { 
      if (Page.MasterPageFile == "~/master/nested.master")) 
      { 
       Page.Master.MasterPageFile = "~/master/mobile.master"; 
      } 
      else 
      { 
       MasterPageFile = "~/master/mobile.master"; 
      } 
     } 
    } 
} 
Problemi correlati