Configuración dinámica de temas en ASP.NET
Pregunta
Tengo una aplicación a la que se conectan diferentes dominios, en lugar de copiar y modificar cada aplicación, uso la misma ubicación física en el disco duro, pero grupos de aplicaciones y sitios web separados en IIS.
Básicamente quiero cambiar un tema basado en el nombre de host. es decir. el usuario llega a " websome.com " obtiene " websome " El tema y el usuario vienen a " jamessome.com " obtiene " jamessome " tema.
Configuré el tema en web.config " páginas " Atributo que aplica el tema globalmente a todo el sitio web. ¿Hay alguna forma en que pueda modificar esa configuración en vuelo en función del uso del dominio ingresado? Probablemente sea posible, pero cuáles son las reducciones y qué sugiere hacer con poco código para simplificar la solución. Como entiendo, si edito web.config cada vez que el usuario ingresa, tomará mucho tiempo, lo que no es tan elegante ... ¿Entonces cualquier gurú de ASP.NET puede escribir dos líneas de código para que suceda la magia?
Hay pocas soluciones para estos problemas en el sitio web, pero esto requerirá que agregue un código al evento Page_Init de cada página del sitio, lo que no es realista.
Solución
En realidad, debe configurarse en Page_PreInit
, no funcionará si intentas cambiar el tema en Page_Init
.
La solución más común es usar una clase principal para todas sus páginas. Este es un cambio de una sola vez y coloca la lógica en la clase principal. En lugar de heredar de Page
, heredará de, por ejemplo, ThemedPage
. Dentro de la clase ThemedPage
, que se hereda de la Page
, por supuesto, puede anular el método Page.OnPreInit.
Pediste " dos líneas " ;, en realidad es una si eliminas el desorden. Esto es VB:
Public Class ThemedPage
Inherits Page
Protected Overrides Sub OnPreInit(ByVal e As System.EventArgs)
Me.Theme = HttpContext.Current.Request.Url.Host.Replace(".com", "")
MyBase.OnPreInit(e)
End Sub
End Class
Y en lugar de esto:
Partial Class _Default
Inherits System.Web.UI.Page
ahora escribes esto:
Partial Class _Default
Inherits ThemedPage
Eso es todo! Una búsqueda / reemplazo de una sola vez y listo. Para completar, aquí es lo mismo (solo la clase) para C #:
// C# version
using System.Web;
using System.Web.UI;
public class ThemedPage : Page
{
protected override void OnPreInit(System.EventArgs e)
{
this.Theme = HttpContext.Current.Request.Url.Host.Replace(".com", "");
base.OnPreInit(e);
}
}
Actualización: ejemplo de código de VB agregado
Actualización: ejemplo de código de C # agregado
Nota: el tema debe existir, de lo contrario, obtendrás una excepción: El tema "ThemeName" no se puede encontrar en la aplicación o en los directorios de temas globales.
. Si desea un tema predeterminado o ningún tema si el tema no está allí, envuélvalo alrededor de un bloque try
/ catch
y use el código catch
bloque para configurar el tema predeterminado.