Impostazione dinamica dei temi in ASP.NET
Domanda
Ho un'applicazione a cui sono collegati domini diversi, invece di copiare e modificare ogni applicazione utilizzo la stessa posizione fisica sul disco rigido ma pool di applicazioni e siti Web separati su IIS.
Fondamentalmente voglio cambiare un tema in base al nome host. vale a dire. l'utente viene su " websome.com " ottiene "websome" il tema e l'utente arrivano a " jamessome.com " ottiene "jamessome" tema.
Ho impostato il tema in web.config " pagine " attributo che applica il tema a livello globale all'intero sito Web. È possibile modificare tale impostazione al volo in base all'utilizzo del dominio inserito da? Probabilmente è possibile, ma quali sono i ridimensionamenti e cosa suggerisci di fare con un piccolo codice per semplificare la soluzione. Come capisco se modifico web.config ogni volta che arriva l'utente, ci vorrà un sacco di tempo, il che non è così elegante ... Quindi qualsiasi guru di ASP.NET là fuori può scrivere due righe di codice in modo che accada la magia?
Esistono poche soluzioni per questo problema sul sito Web, ma ciò richiederà di aggiungere codice all'evento Page_Init di ogni pagina del sito che non è realistico.
Soluzione
In realtà, deve essere impostato in Page_PreInit
, non funzionerà se si tenta di cambiare il tema in Page_Init
.
La soluzione più comune è usare una classe genitore per tutte le tue pagine. Questa è una modifica unica e inserisce la logica nella classe genitore. Invece di ereditare da Page
erediti da, diciamo, ThemedPage
. All'interno della classe ThemedPage
, che eredita naturalmente dalla Pagina
, puoi sovrascrivere il metodo Page.OnPreInit.
Hai chiesto " due righe " ;, in realtà è una se rimuovi il disordine. Questo è 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
E invece di questo:
Partial Class _Default
Inherits System.Web.UI.Page
ora scrivi questo:
Partial Class _Default
Inherits ThemedPage
Questo è tutto! Una ricerca / sostituzione una tantum e il gioco è fatto. Per completezza, ecco lo stesso (solo la classe) per 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);
}
}
Aggiornamento : esempio di codice VB aggiunto
Aggiornamento: esempio di codice C # aggiunto
Nota : il tema deve esistere, altrimenti si ottiene un'eccezione: Tema "Nome tema" non può essere trovato nelle directory dell'applicazione o del tema globale.
. Se vuoi un tema predefinito o nessun tema se il tema non è presente, avvolgilo attorno a un blocco try
/ catch
e usa il catch
blocco per l'impostazione del tema predefinito.