ASP.Net stellt Theme-Skins bereit, bei denen es sich eigentlich um Skin-Änderungen handelt. Viele Leute im Internet sagen jedoch, dass dieses Ding nutzlos ist, und sagen, dass dieses Ding in ASPX-Seiten verwendet werden kann, aber nicht in Masterseiten (MasterPage). Ja, es stimmt, dass Sie das Thema der gesamten Website nicht direkt über eine DDL-Auswahl in MasterPage wechseln können, da die Page.Theme-Eigenschaft in PreInit(){} festgelegt ist. Andernfalls wird ein Fehler gemeldet und MasterPage wird nicht ausgeführt PreInit().
Ich hoffe, dass dieses Beispiel jedem helfen kann, dieses Problem zu lösen. Damit jeder meinen Quellcode besser versteht, werde ich ihn im Folgenden kurz vorstellen.
Lassen Sie uns zunächst über die Idee sprechen: Unser Ziel ist es, eine DropDownList in die MasterPage einzufügen, indem wir die DropDownList austauschen (ich verwende DropDownList hier nicht, sondern verwende CSS, um eine „DropDownList“ zu simulieren, in der in jedem Element ein LinkButton platziert wird, und Jeder LinkButtond Der Wert von PostBackUrl hat die Form: „~/ThemeTool.aspx?Theme=theme name“ ), um das Thema der gesamten Website zu ändern, anstatt nur die aktuelle Seite zu ändern, genau wie bei Discuz!, also Diese Änderung ist global, gilt jedoch für den aktuellen Thread, d. h. Benutzer A ändert das Thema, was nur für Benutzer A wirksam ist und keine Auswirkungen auf Benutzer B hat, sodass wir die Konfigurationsdatei nicht ändern Denken Sie schnell an die Sitzung. Ja, wir müssen den Namen des Themas in die Sitzung einfügen, z. B. Session["Theme"]="Blue". Auf diese Weise muss jede Seite nur den Wert der Sitzung erhalten Page_PreInit() und weisen Sie es dem Page.Theme-Attribut der Seite zu, und es ist in Ordnung.
Wenn wir die Option „DropDowList“ ändern, klicke ich hier tatsächlich auf einen anderen Link-Button, was bedeutet, dass ich den Namen des Themas ändere, was bedeutet, dass ich den Wert von Session[„Theme“] ändere. Wo soll diese „Änderung“ ausgeführt werden? Dies ist sehr kritisch. Ist es in LinkButton_Click()? Nein, da die erneute Erfassung von Page.Theme in Page_PreInit() erfolgen muss und LinkButton_Click() sehr spät nach dem Laden erfolgt, geschweige denn nach PreInit(), sodass ich hier zu ThemeTool springe, in .aspx verarbeitet und dann zur Originalseite weitergeleitet werde Nach der Verarbeitung wird der Wert von Session["Theme"] vor PreInit() der Originalseite geändert. Bitte seien Sie versichert, dass dieser Vorgang nicht dazu führt, dass ThemeTool in den Browser geladen wird Ich habe mir gerade Page_PreInit() ausgeliehen und bin sofort nach der Verwendung wieder gegangen, haha! !
Okay, das ist die Idee, stellen wir die nächsten drei Dateien vor:
1. MasterPage.master, was in dieser Datei erwähnenswert ist, ist meine mit CSS simulierte „DropDownList“. Jedes Element der „DropDownList“ hat einen LinkButton und der Wert der PostBackUrl jedes LinkButtond hat die Form: „ ~/ThemeTool. aspx?Theme=Themename“, sodass jedes Mal, wenn die Option „DropDownList“ geändert wird, ein neuer Theme-Wert an ThemeTool.aspx übergeben wird und ThemeTool.aspx dann den neuen Theme-Wert verarbeitet und in der Sitzung speichert. .
2. Es gibt eine ThemeSkin.cs-Datei im Ordner App_Code, die zwei statische Methoden enthält: GetTheme(Page P) und GetTheme(Page P). Diese Methode befindet sich auf der Website . Es wird in Page_PreInit() jeder Seite aufgerufen, die ein Thema haben muss (ich bin hier Default.aspx und Default2.aspx l). Der Parameter P bezieht sich auf die Seite, die die Methode aufruft, die ein Objekt vom Typ Seite ist. ChangeTheme() wird zum Wechseln des Themas verwendet und wird in Page_PreInit() von ThemeTool.aspx.cs aufgerufen.
3. Die ThemeTool.aspx-Seite im Stammverzeichnis ist ebenfalls sehr wichtig. Der Theme-Wechsel erfolgt in ihrem Page_PreInit. Wer hat MasterPage angewiesen, PreInit nicht auszuführen? Der darin enthaltene Code ist sehr einfach. Wenn Sie mir nicht glauben, werfen Sie einen Blick darauf.
Expandieren