2008-08-18 19 views
8

Ich arbeite an einer Site, die zwei oder mehr Looks unterstützen soll, die zur Laufzeit änderbar sind. 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 Masterpage verwenden.Festlegen einer ASP.NET-Masterseite zur Laufzeit

Also, was ist der beste Weg, um die Masterpage zur Laufzeit einzustellen? Page.MasterPageFile kann nur im Page.OnPreInit-Ereignis festgelegt werden. Es sieht so aus, als würden die Lösungen alle meine Seiten von einer gemeinsamen Basis erben lassen, die das PreInit-Ereignis behandelt, oder ein HttpModule verwenden, das das tut.

Irgendwelche Ratschläge?

Antwort

6

Ich habe dies schon einmal getan, ich habe genau das getan, was Sie beschrieben haben (Alle Seiten erben von einer benutzerdefinierten Seite mit einem OnPreInit-Ereignis). Auch hatte ich 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 Master-Seite erfordern.

2

Statt zwei verschiedene Masterseiten, wie wäre es mit einem Master, der verschiedene Benutzersteuerelemente und Inhalts-HTML-Literale dynamisch lädt?

1

Es ist einfach genug, PreInit zu verarbeiten und die eine Codezeile einzufügen, die zum Laden der richtigen Masterseite benötigt wird.

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

In Abwesenheit einiger zwingender Grund, nicht diesen Weg zu gehen, das ist, was ich tun würde, unabhängig davon, wo Sie die PreInit behandeln.

0

Ich bin gespannt, was entscheidet, 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?

Code hinter wird in den Masterseiten unterstützt, so dass Sie einige Logik in Ihre eine Masterseite legen können, um zu entscheiden, was angezeigt werden soll.

Ich habe mehrere Websites gesehen, die basierend auf Benutzerklicks Cookies setzen (um die Schriftgröße oder die Seitenbreite zu ändern) und dann verschiedene CSS-Dateien basierend auf dem Wert dieser Cookies anwenden. Wenn kein Cookie vorhanden ist, zeigen Sie ein Standard-Look-and-Feel an.

EDIT:

Ein anderer Gedanke hier, wenn Sie versuchen einfach, CSS zu wechseln out ist Ihr Stil-Tag gesetzt auf dem Server, und weisen Sie Eigenschaften, um es während der Laufzeit zu laufen. Dies würde wiederum die Verwendung einer einzelnen Masterseite erfordern und den Code hinter die Masterseite stellen, wahrscheinlich im PreInit-Event-Handler.

Da ich diese Lösung nie implementiert habe, bin ich mir nicht sicher, ob das ganze <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> 
2

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 Seite getan hätte.

Allerdings wollte ich die MasterPageFile basierend auf einer Profileigenschaft festlegen, so dass etwa 5 Zeilen Code pro Seite gewesen wären, ein Albtraum der Wartbarkeit. Und trotzdem, "wiederhole dich nicht", richtig?

Also habe ich eine Extension-Methode in einem Modul im Ordner App_Code erstellt, um dies einfacher und wartungsfreundlicher 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 gegenseitig auf die PreInit Seite, ich dies einfach anrufen:

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

Inherit alle Sie 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"; 
    } 
} 
Verwandte Themen