ASP.Net proporciona máscaras de temas, que en realidad son cambios de máscara. Sin embargo, muchas personas en Internet dicen que esto es inútil y dicen que se puede usar en páginas .aspx, pero no en páginas maestras (MasterPage). Sí, es cierto que no puede cambiar directamente el tema de todo el sitio web a través de una selección DDL en MasterPage, porque la propiedad Page.Theme está configurada en PreInit(){}; de lo contrario, se informará un error y MasterPage no se ejecutará. PreInicio().
Espero que este ejemplo pueda ayudar a todos a resolver este problema. Para que todos comprendan mejor mi código fuente, lo presentaré brevemente a continuación.
Primero, hablemos de la idea: nuestro propósito es colocar una DropDownList en MasterPage, cambiando la DropDownList (aquí no uso DropDownList, pero uso CSS para simular una "DropDownList" en la que se coloca un LinkButton en cada elemento, y cada LinkButtond El valor de PostBackUrl tiene el formato: "~/ThemeTool.aspx?Theme=nombre del tema" ) para cambiar el tema de todo el sitio web, en lugar de simplemente cambiar la página actual, como la de Discuz!, entonces Este cambio es global, pero es para el hilo actual, es decir, el usuario A cambia el tema, lo cual solo es efectivo para el usuario A y no tiene ningún impacto en el usuario B, por lo que no tocaremos el archivo de configuración. piense rápidamente en la sesión. Sí, necesitamos poner el nombre del tema en la sesión, como Session["Theme"]="Blue" de esta manera, cada página solo necesita obtener el valor de la sesión; Page_PreInit() y asígnelo al atributo Page.Theme de la página, y estará bien.
Cuando cambiamos la opción "DropDowList", aquí hago clic en un botón de enlace diferente, lo que significa cambiar el nombre del tema, lo que significa cambiar el valor de Sesión ["Tema"]. Este "cambio" ¿Dónde ejecutarlo? Esto es muy crítico. ¿Está en LinkButton_Click()? No, porque volver a adquirir Page.Theme debe estar en Page_PreInit (), y LinkButton_Click () ocurre muy tarde, después de cargar, y mucho menos PreInit (), así que salto a ThemeTool Procesado en .aspx y luego redirigido a la página original. después del procesamiento, de modo que el valor de Session["Theme"] se cambie antes de PreInit() de la página original. Tenga la seguridad de que este proceso no hará que ThemeTool se cargue en el navegador. Lo que no podemos ver. Simplemente tomé prestada su Page_PreInit() y la fui inmediatamente después de usarla, ¡jaja! !
Bien, esa es la idea, presentemos los siguientes tres archivos:
1. MasterPage.master, lo que vale la pena mencionar en este archivo es mi "DropDownList" simulado con CSS. Cada elemento de "DropDownList" tiene un LinkButton, y el valor de PostBackUrl de cada LinkButtond tiene el formato: "~/ThemeTool. aspx?Theme=Nombre del tema", de modo que cada vez que se cambie la opción "DropDownList", se pasará un nuevo valor de Tema a ThemeTool.aspx, y luego ThemeTool.aspx procesará el nuevo valor de Tema y lo almacenará en la Sesión. .
2. Hay un archivo ThemeSkin.cs en la carpeta App_Code, que contiene dos métodos estáticos: GetTheme (Página P) y GetTheme (Página P) se utiliza para obtener el tema. Se llama en Page_PreInit() de cada página que necesita tener un tema (estoy aquí Default.aspx y Default2.aspx l). El parámetro P se refiere a la página que llama al método, que es un objeto de tipo Página; ChangeTheme() se utiliza para cambiar el tema y se llama en Page_PreInit() de ThemeTool.aspx.cs.
3. La página ThemeTool.aspx en el directorio raíz también es muy importante. El cambio de tema se realiza en su Page_PreInit. ¿Quién le dijo a MasterPage que no ejecutara PreInit? El código que contiene es muy simple. Si no me crees, échale un vistazo.
Expandir