Pregunta

Estoy trabajando en un sitio que debe poder admitir dos o más estilos, modificables en tiempo de ejecución.Esperaba poder manejar el cambio con un cambio de CSS, pero parece que necesitaré usar una página maestra diferente para cada diseño.

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 son hacer que todas mis páginas hereden de una base común que maneja el evento PreInit, o usar un HttpModule que haga eso.

¿Algún consejo?

¿Fue útil?

Solución

Ya hice esto una vez antes, hice exactamente lo que usted describió (hice que todas las páginas heredaran de una página personalizada con un evento OnPreInit).También tenía un Application_PreRequestHandlerExecute personalizado en mi Global.asax.cs para configurar Page.StyleSheetTheme para realizar cambios de imagen/css que no requerían una página maestra diferente.

Otros consejos

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

Siento tu dolor.Busqué durante aproximadamente una hora (si no más) un problema relacionado con esto, sin éxito.No es solo una respuesta sencilla decir "simplemente llámalo desde PreInit en cada página" cuando tienes cientos de páginas.Pero luego me di cuenta de que estaba dedicando más tiempo a buscar una solución del que me habría llevado hacerlo en cada página.

Sin embargo, quería configurar MasterPageFile en función de una propiedad de perfil, por lo que habrían sido aproximadamente 5 líneas de código por página, una pesadilla de mantenimiento.Y en fin, "no te repitas", ¿no?

Así que creé un método de extensión en un módulo de la carpeta App_Code para que esto sea más fácil y 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 luego, en el PreInit de cada página, simplemente llamo a esto:

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

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 convincente para no seguir este camino, eso es lo que haría, independientemente de dónde maneje PreInit.

Tengo curiosidad por saber qué decide cómo debe verse la página.¿Es el usuario haciendo clic en un botón para cambiar el tema?¿Se basa en la URL que se utilizó para acceder 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é se debe mostrar.

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

EDITAR:

Otra idea aquí, si simplemente está intentando cambiar CSS es configurar su etiqueta de estilo para que se ejecute en el servidor y asignarle propiedades 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 subyacente de la página maestra, probablemente en el controlador de eventos PreInit.

Como nunca implementé esta solución, no estoy seguro de si toda la etiqueta <HEAD> debe ejecutarse en el servidor o no.


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

Hereda todas tus 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";
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top