2008-08-18 22 views
8

Estoy trabajando en un sitio que necesita para ser compatible con dos o más aspectos, modificables en tiempo de ejecución. Esperaba poder manejar el cambio con un modificador de CSS, pero parece que tendré que usar una página maestra diferente para cada diseño.Configuración de una página maestra ASP.NET en el tiempo de ejecución

Entonces, ¿cuál es la mejor manera de configurar la página maestra en tiempo de ejecución? Page.MasterPageFile solo se puede configurar en el evento Page.OnPreInit. Parece que las soluciones consisten en hacer que todas mis páginas hereden de una base común que maneje el evento PreInit, o usar un HttpModule que lo haga.

¿Algún consejo?

Respuesta

6

He hecho esto una vez, hice exactamente lo que describió (todas las páginas heredaron de una página personalizada con un evento OnPreInit). También tenía un Application_PreRequestHandlerExecute personalizado en mi Global.asax.cs para establecer Page.StyleSheetTheme para hacer cambios de imagen/CSS que no requerían una página maestra diferente.

2

En lugar de dos páginas maestras diferentes, ¿qué tal tener un maestro que cargue dinámicamente diferentes controles de usuario y literales HTML de contenido?

1

Es bastante fácil manejar PreInit e insertar la línea de código necesaria para cargar la página maestra adecuada.

this.Page.MasterPageFile = "~/default.master"; 

En ausencia de alguna razón de peso para no seguir este camino, eso es lo que haría, sin importar en el que maneje el PreInit.

0

Tengo curiosidad por lo que decide cómo debe verse la página? ¿El usuario hace clic en un botón para cambiar el tema? ¿Se basa en la URL que se utilizó para llegar al sitio?

El código subyacente es compatible con las páginas maestras, por lo que podría poner algo de lógica en su página maestra para decidir qué debería mostrarse.

He visto varios sitios establecer cookies en función de los clics del usuario (para cambiar el tamaño de la fuente o ancho de página) y luego aplicar diferentes archivos CSS en función del valor de esas cookies. Si no hay cookies, muestra una apariencia predeterminada.

EDIT:

Otro pensamiento aquí, si simplemente está tratando de cambiar a cabo CSS es establecer su etiqueta de estilo para ejecutar en el servidor, y asignar propiedades a ella en tiempo de ejecución. Una vez más, esto requeriría el uso de una única página maestra y colocar el código detrás de la página maestra, probablemente en el controlador de eventos PreInit.

Como nunca he implementado esta solución, no estoy seguro de si toda la etiqueta <HEAD> tiene que ejecutarse en el servidor o no.


<html> 
<head id="Head" runat="server"> 
<style id="StylePlaceholder" runat="server" type="text/css"></style> 
</head> 
2

Siento tu dolor. Busqué alrededor de una hora (si no más) por un problema relacionado con esto, sin éxito. No es solo una respuesta abreviada decir "solo llámalo de PreInit en cada página" cuando tienes cientos de páginas. Pero luego me di cuenta de que estaba pasando más tiempo buscando una solución de la que hubiera tomado simplemente hacerlo en cada página.

Sin embargo, quería establecer MasterPageFile basado en una propiedad Profile, por lo que habría sido de aproximadamente 5 líneas de código en cada página, una pesadilla de mantenimiento. Y de todos modos, "no te repitas", ¿verdad?

Así que creé un método de extensión en un módulo en la carpeta App_Code para hacerlo más fácil y más fácil de mantener.

Public Module WebFunctions 

    <System.Runtime.CompilerServices.Extension()> _ 
    Public Sub SetMaster(ByVal page As Page) 

     Dim pb As ProfileCommon = DirectCast(HttpContext.Current.Profile, ProfileCommon) 

     If pb IsNot Nothing Then 
      page.MasterPageFile = pb.MasterPage 
     End If 

    End Sub 

End Module 

Y que a las de cada página PreInit, sólo llamo a esto:

Protected Sub Page_PreInit(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreInit 
     Me.SetMaster() 
    End Sub 
0

Heredar todo lo que las páginas de una clase base como

public class PageBase : System.Web.UI.Page 
{ 
    public PageBase() 
    { 
     this.PreInit += new EventHandler(PageBase_PreInit); 
    } 
    void PageBase_PreInit(object sender, EventArgs e) 
    { 
     this.MasterPageFile = "~/MyMasterPage.Master"; 
    } 
} 
Cuestiones relacionadas