2009-02-24 23 views

Respuesta

9

Acabo de probar esto y funciona desde el preinicio de la página que está utilizando la página principal anidada.

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

Obviamente tendrá que asegurarse de que los ContentPlaceholderIds son consistentes a través de las páginas que están cambiando el medio.

+0

Hmm sí, esa es una solución. Desafortunadamente eso significa poner código en cada página que usa la página maestra en lugar de en un solo lugar. No estoy seguro de cuál es la menor de dos males ... ¡copiar la página maestra para que haya dos copias sería mucho menos trabajo! –

3

Combinamos el método de Andy con una clase "BasePage": creamos una clase que hereda de System.Web.UI.Page, y luego todas nuestras páginas heredan de esta clase.

Luego, en nuestra clase de página base, podemos realizar las comprobaciones pertinentes para ver qué página raíz se debe usar: en nuestro caso, tenemos un maestro "Presentación" y un maestro "Autoría": la versión de presentación tiene todos los muebles de navegación y página, junto con CSS de pantalla grande, mientras que el maestro autor tiene algunos JS adicionales para las herramientas de autoría, CSS más ligero y ninguna navegación (es lo que usamos cuando el usuario está realmente creando una página, en lugar de modificar el plano del sitio).

Esta página base puede llamar a Page.Master.MasterPageFile y configurarlo en el maestro de autoría si ese es el estado correcto para la página.

2

Sólo en caso de que alguien se tropieza con esto y las lágrimas de los pelos con un "Los controles de contenido tienen que ser los controles de primer nivel en una página de contenido o una página maestra anidada que hace referencia a una página maestra" error al intentar código de Andy , deshágase del this.Master. Por lo tanto, el código se convierte en:

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

Editar Como Zhaph señala a continuación, el código que tengo ^^ no sólo cambiará el amo de la página actual, no maestro del maestro. Este es el código del que hablaba Hainesy cuando mencionó ", todos sabemos acerca de cómo cambiar dinámicamente una página maestra" (lo que no hice, d'oh). Si llegas a esta página buscando en google "stackoverflow change master page" (que es lo que hice) entonces este es posiblemente el código que estás buscando :-)

+0

Pero eso solo cambiará la página maestra interna, y no la externa, que es lo que Hainesy quería. Diría que tienes un problema con un maestro externo que no tiene todos los marcadores de posición necesarios para el maestro interno. –

+0

Ahh, tengo.Tuve el final equivocado en este caso, lo siento. Tenía la página estándar estándar con un maestro, en lugar de un maestro anidado. Eso me enseñará a leer y pensar primero :-) –

+0

Sin preocupaciones, +1 para su edición :) –

0

Para agregar a la respuesta de Zhaph - Ben Duguid, (+1 por cierto):

Aquí hay un código de ejemplo que establece la página maestra de la página maestra anidada. Todas las páginas heredan de esta BasePage, por lo que este código solo existe en un solo lugar.

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"; 
      } 
     } 
    } 
} 
Cuestiones relacionadas