Définition dynamique de thèmes dans ASP.NET
Question
J'ai une application à laquelle différents domaines sont connectés, au lieu de copier et de modifier chaque application, j'utilise le même emplacement physique sur le disque dur, mais des pools d'applications et des sites Web distincts sur IIS.
En gros, je veux changer un thème en fonction du nom d’hôte. c'est à dire. l'utilisateur accède à " websome.com " obtient " websome " Le thème et l'utilisateur arrivent sur "jamessome.com". obtient " jamessome " thème.
J'ai défini le thème dans web.config " pages " attribut qui applique le thème globalement à l'ensemble du site. Existe-t-il un moyen de modifier ce paramètre à la volée en fonction de l'utilisation du domaine entré? C'est probablement possible, mais quelles sont les réductions de taille et que suggérez-vous de faire avec peu de code afin de simplifier la solution? Si je comprends bien, si je modifie web.config chaque fois que l'utilisateur entre, cela prendra beaucoup de temps, ce qui n'est pas si élégant ... Donc, tous les gourous d'ASP.NET peuvent écrire deux lignes de code pour que la magie se produise?
Il existe peu de solutions à ces problèmes sur le site Web, mais cela nécessitera d'ajouter du code à l'événement Page_Init de chaque page du site, ce qui est irréaliste.
La solution
En fait, il doit être défini dans Page_PreInit
, cela ne fonctionnera pas si vous essayez de changer le thème dans Page_Init
.
La solution la plus courante consiste à utiliser une classe parente pour toutes vos pages. Ceci est un changement unique et place la logique dans la classe parente. Au lieu d'hériter de Page
, vous héritez de, disons ThemedPage
. Dans la classe ThemedPage
, qui hérite de Page
elle-même, vous pouvez bien sûr remplacer la méthode Page.OnPreInit.
Vous avez demandé "deux lignes", c’est en fait une si vous supprimez le fouillis. C'est 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
Et au lieu de cela:
Partial Class _Default
Inherits System.Web.UI.Page
vous écrivez maintenant ceci:
Partial Class _Default
Inherits ThemedPage
C'est tout! Une recherche / remplacement ponctuelle et vous avez terminé. Par souci d’exhaustivité, voici la même chose (seulement la classe) pour 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);
}
}
Mise à jour: exemple de code VB ajouté
Mise à jour : exemple de code C # ajouté
Remarque: le thème doit exister, sinon vous obtenez une exception: Le thème 'Nom du thème' est introuvable. dans les répertoires d'applications ou de thèmes globaux.
. Si vous voulez un thème par défaut ou aucun thème si le thème n'y est pas, enroulez-le autour d'un bloc try
/ catch
et utilisez le catch
. bloquer pour définir le thème par défaut.