Ich arbeite an einer Site, die zwei oder mehr Looks unterstützen soll, die zur Laufzeit änderbar sind. Ich hatte gehofft, mit einem CSS-Schalter umgehen zu können, aber es sieht so aus, als müsste ich für jedes Design eine andere Masterpage verwenden.
Wie kann man die Masterpage am besten zur Laufzeit einstellen? Page.MasterPageFile kann nur im Page.OnPreInit-Ereignis festgelegt werden. Es sieht so aus, als ob die Lösungen alle meine Seiten von einer gemeinsamen Basis erben lassen, die das PreInit-Ereignis behandelt, oder ein HttpModule, das das tut.
Irgendwelche Ratschläge?
Ich habe das schon einmal gemacht, ich habe genau das getan, was Sie beschrieben haben (Alle Seiten erben von einer benutzerdefinierten Seite mit einem OnPreInit-Ereignis). Auch ich hatte eine benutzerdefinierte Application_PreRequestHandlerExecute in meinem Global.asax.cs für die Einstellung Page.StyleSheetTheme für die Durchführung von Bild / CSS-Änderungen, die nicht eine andere Masterseite erfordern.
Ich fühle deinen Schmerz. Ich suchte etwa eine Stunde (wenn nicht mehr) nach einem Problem, ohne Erfolg. Es ist nicht nur eine einfache und trockene Antwort zu sagen "rufen Sie es einfach von PreInit auf jeder Seite", wenn Sie Hunderte von Seiten haben. Aber dann wurde mir klar, dass ich mehr Zeit damit verbrachte, nach einer Lösung zu suchen, als es auf jeder einzelnen Seite getan hätte.
Allerdings wollte ich die MasterPageFile basierend auf einer Profileigenschaft festlegen, so dass jeder Seite etwa 5 Zeilen Code zur Verfügung standen, was ein Albtraum der Wartbarkeit ist. Und trotzdem, "wiederhole dich nicht", richtig?
Also habe ich eine Extension-Methode in einem Modul im App_Code-Ordner erstellt, um dies einfacher und wartbarer zu machen.
%Vor%Und dann auf jeder Seite PreInit, rufe ich einfach das:
%Vor%Es ist einfach genug, PreInit zu verarbeiten und die eine Codezeile einzufügen, die benötigt wird, um die richtige Masterseite zu laden.
%Vor%In Ermangelung eines zwingenden Grundes, diesen Weg nicht zu gehen, würde ich das tun, egal wo Sie mit dem PreInit arbeiten.
Ich bin gespannt, wie die Seite aussehen soll? Ist es der Benutzer, der auf eine Schaltfläche klickt, um das Thema zu ändern? Basiert es auf der URL, die verwendet wurde, um auf die Website zu gelangen?
Hinterer Code wird in den Masterseiten unterstützt, so dass Sie eine gewisse Logik in Ihre eine Masterseite einfügen können, um zu entscheiden, was angezeigt werden soll.
Ich habe mehrere Websites gesehen, die basierend auf Nutzerklicks Cookies setzen (um die Schriftgröße oder die Seitenbreite zu ändern) und dann basierend auf dem Wert dieser Cookies verschiedene CSS-Dateien anwenden. Wenn kein Cookie vorhanden ist, zeigen Sie ein Standard-Look-and-Feel an.
BEARBEITEN:
Ein anderer Gedanke hier, wenn Sie einfach versuchen, CSS auszuschalten, ist, dass Sie Ihr style-Tag auf dem Server ausführen und ihm zur Laufzeit Eigenschaften zuweisen. Dies würde wiederum die Verwendung einer einzelnen Masterseite erfordern und den Code hinter die Masterseite setzen, wahrscheinlich im PreInit-Event-Handler.
Da ich diese Lösung nie implementiert habe, bin ich mir nicht sicher, ob das ganze & lt; HEAD & gt; Tag muss auf dem Server laufen oder nicht.
%Vor%Tags und Links .net asp.net master-pages