Frage

Ich arbeite an einer Site, die zwei oder mehr Looks unterstützen muss, die zur Laufzeit geändert werden können.Ich hatte gehofft, die Änderung mit einem CSS-Schalter bewältigen zu können, aber es sieht so aus, als müsste ich für jedes Design eine andere Masterseite verwenden.

Wie lässt sich die Masterseite also am besten zur Laufzeit festlegen?Page.MasterPageFile kann nur im Page.OnPreInit-Ereignis festgelegt werden.Es sieht so aus, als ob die Lösung darin besteht, alle meine Seiten von einer gemeinsamen Basis erben zu lassen, die das PreInit-Ereignis verarbeitet, oder ein HttpModule zu verwenden, das dies tut.

Irgendein Rat?

War es hilfreich?

Lösung

Ich habe das schon einmal gemacht, ich habe genau das gemacht, was Sie beschrieben haben (alle Seiten mit einem OnPreInit-Ereignis von einer benutzerdefinierten Seite erben lassen).Außerdem hatte ich in meiner Global.asax.cs ein benutzerdefiniertes Application_PreRequestHandlerExecute zum Festlegen von Page.StyleSheetTheme für Bild-/CSS-Änderungen, die keine andere Masterseite erforderten.

Andere Tipps

Wie wäre es, wenn Sie anstelle von zwei unterschiedlichen Masterseiten einen Master hätten, der verschiedene Benutzersteuerelemente und Inhalts-HTML-Literale dynamisch lädt?

Ich fühle deinen Schmerz.Ich habe ungefähr eine Stunde (wenn nicht länger) nach einem Problem zu diesem Thema gesucht, ohne Erfolg.Es ist nicht nur eine einfache Antwort zu sagen: „Rufen Sie es einfach von PreInit auf jeder Seite auf“, 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 gekostet hätte, es einfach auf jeder Seite zu tun.

Allerdings wollte ich die MasterPageFile basierend auf einer Profile-Eigenschaft festlegen, so dass pro Seite etwa fünf Codezeilen erforderlich gewesen wären, was ein Albtraum für die Wartbarkeit war.Und überhaupt: „Wiederholen Sie sich nicht“, oder?

Deshalb habe ich in einem Modul im App_Code-Ordner eine Erweiterungsmethode erstellt, um dies einfacher und wartbarer zu machen.

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

Und dann rufe ich im PreInit jeder Seite einfach Folgendes auf:

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

Es ist einfach genug, PreInit zu handhaben und die eine Codezeile einzufügen, die zum Laden der richtigen Masterseite erforderlich ist.

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

Wenn es keinen zwingenden Grund gibt, diesen Weg nicht zu gehen, würde ich das tun, unabhängig davon, wo Sie PreInit handhaben.

Ich bin gespannt, was darüber entscheidet, wie die Seite aussehen soll?Klickt der Benutzer auf eine Schaltfläche, um das Thema zu ändern?Basiert es auf der URL, die zum Aufrufen der Website verwendet wurde?

Der Code dahinter wird in Masterseiten unterstützt, sodass Sie Ihrer Masterseite eine gewisse Logik hinzufügen können, um zu entscheiden, was angezeigt werden soll.

Ich habe mehrere Websites gesehen, die Cookies basierend auf Benutzerklicks gesetzt haben (um die Schriftgröße oder die Seitenbreite zu ändern) und dann basierend auf dem Wert dieser Cookies unterschiedliche CSS-Dateien angewendet haben.Wenn kein Cookie vorhanden ist, wird ein Standard-Erscheinungsbild angezeigt.

BEARBEITEN:

Ein weiterer Gedanke hier, wenn Sie einfach versuchen, CSS auszutauschen, besteht darin, Ihr Style-Tag so einzustellen, dass es auf dem Server ausgeführt wird, und ihm zur Laufzeit Eigenschaften zuzuweisen.Dies würde wiederum die Verwendung einer einzelnen Masterseite und das Einfügen von Code als Code-Behind der Masterseite erfordern, wahrscheinlich im PreInit-Ereignishandler.

Da ich diese Lösung noch nie implementiert habe, bin ich mir nicht sicher, ob das gesamte <HEAD>-Tag auf dem Server ausgeführt werden muss oder nicht.


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

Erben Sie alle Ihre Seiten von einer Basisklasse wie

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";
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top