Question

Je travaille sur un site qui doit pouvoir prendre en charge deux looks ou plus, modifiables au moment de l'exécution.J'espérais pouvoir gérer le changement avec un commutateur CSS, mais il semble que je devrai utiliser une page maître différente pour chaque conception.

Alors, quelle est la meilleure façon de définir la page maître au moment de l'exécution ?Page.MasterPageFile ne peut être défini que dans l'événement Page.OnPreInit.Il semble que les solutions consistent à faire en sorte que toutes mes pages héritent d'une base commune qui gère l'événement PreInit, ou à utiliser un HttpModule qui fait cela.

Aucun conseil?

Était-ce utile?

La solution

Je l'ai déjà fait une fois, j'ai fait exactement ce que vous avez décrit (faire en sorte que toutes les pages héritent d'une page personnalisée avec un événement OnPreInit).J'avais également un Application_PreRequestHandlerExecute personnalisé dans mon Global.asax.cs pour définir Page.StyleSheetTheme afin d'effectuer des modifications d'image/css qui ne nécessitaient pas une page maître différente.

Autres conseils

Plutôt que deux pages maîtres différentes, que diriez-vous d'avoir un maître qui charge dynamiquement différents contrôles utilisateur et littéraux HTML de contenu ?

Je ressens ta douleur.J'ai cherché pendant environ une heure (sinon plus) un problème à ce sujet, sans succès.Ce n'est pas seulement une réponse simple de dire "appelez-le simplement depuis PreInit sur chaque page" lorsque vous avez des centaines de pages.Mais ensuite j'ai réalisé que je passais plus de temps à chercher une solution qu'il n'en aurait fallu pour le faire sur chaque page.

Cependant, je voulais définir MasterPageFile en fonction d'une propriété Profile, ce qui aurait représenté environ 5 lignes de code par page, un cauchemar en termes de maintenabilité.Et puis, "ne te répète pas", non ?

J'ai donc créé une méthode Extension dans un module du dossier App_Code pour rendre cela plus facile et plus maintenable.

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

Et puis sur le PreInit de chaque page, j'appelle simplement ceci :

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

Il est assez simple de gérer PreInit et d'insérer la seule ligne de code nécessaire pour charger la page maître appropriée.

this.Page.MasterPageFile = "~/default.master";

En l'absence de raison impérieuse de ne pas emprunter cette voie, c'est ce que je ferais, quel que soit l'endroit où vous gérez le PreInit.

Je suis curieux de savoir ce qui détermine l'apparence de la page ?Est-ce l'utilisateur qui clique sur un bouton pour changer de thème ?Est-ce basé sur l’URL utilisée pour accéder au site ?

Le code derrière est pris en charge dans les pages maîtres, vous pouvez donc mettre un peu de logique dans votre page maître pour décider de ce qui doit être affiché.

J'ai vu plusieurs sites définir des cookies en fonction des clics des utilisateurs (pour modifier la taille de la police ou la largeur de la page), puis appliquer différents fichiers CSS en fonction de la valeur de ces cookies.Si aucun cookie n’est présent, affichez une apparence par défaut.

MODIFIER:

Une autre idée ici, si vous essayez simplement de désactiver CSS, est de définir votre balise de style pour qu'elle s'exécute sur le serveur et de lui attribuer des propriétés au moment de l'exécution.Encore une fois, cela nécessiterait l'utilisation d'une seule page maître et la mise en code du code-behind de la page maître, probablement dans le gestionnaire d'événements PreInit.

Comme je n'ai jamais implémenté cette solution, je ne sais pas si l'ensemble de la balise <HEAD> doit s'exécuter sur le serveur ou non.


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

Héritez de toutes vos pages d'une classe de base comme

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";
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top