ASP.Net は、実際にはスキンの変更であるテーマ スキンを提供します。しかし、インターネット上の多くの人は、これは役に立たない、つまり .aspx ページでは使用できるが、マスター ページ (MasterPage) では使用できないと言っています。はい、確かに、Page.Theme プロパティは PreInit(){} で設定されているため、MasterPage の DDL 選択を通じて Web サイト全体のテーマを直接切り替えることはできません。そうしないと、エラーが報告され、MasterPage は実行されません。 PreInit()。
この例が皆さんのこの問題の解決に役立つことを願っています。皆さんが私のソースコードをよりよく理解できるように、以下にソースコードを簡単に紹介します。
まずアイデアについて話しましょう。私たちの目的は、DropDownList を切り替えることで、MasterPage に DropDownList を配置することです (ここでは DropDownList を使用しませんが、Css を使用して、各項目に LinkButton が配置される「DropDownList」をシミュレートします)。各 LinkButtond PostBackUrl の値は次の形式です: "~/ThemeTool.aspx?Theme=テーマ名" ) これは、Discuz! のように現在のページを変更するだけでなく、Web サイト全体のテーマを変更するためです。この変更はグローバルですが、現在のスレッドに対するものです。つまり、ユーザー A がテーマを変更します。これはユーザー A にのみ有効で、ユーザー B には影響しません。そのため、構成ファイルには触れません。はい、Session["Theme"]="Blue" のようにセッションにテーマの名前を入力する必要があります。各ページはセッションの値を取得するだけです。 Page_PreInit() を実行し、ページの Page.Theme 属性に割り当てれば OK です。
「DropDowList」オプションを変更するとき、ここでは実際に別のリンクボタンをクリックします。これはテーマの名前を変更することを意味します。これは、Session["Theme"] の値を変更することを意味します。この「変更」はどこで実行されますか?これは非常に重要です。LinkButton_Click() にありますか?いいえ、Page.Theme の再取得は Page_PreInit() 内で行う必要があり、LinkButton_Click() は PreInit() どころか Load 後も非常に遅いので、ここで ThemeTool にジャンプし、.aspx で処理され、元のページにリダイレクトされます。処理後、元のページの PreInit() の前に Session["Theme"] の値が変更されるため、この処理によって ThemeTool がブラウザに読み込まれることはありませんので、ご安心ください。 Page_PreInit() を借用して、使用後すぐに終了しました (笑)。 !
さて、アイデアはこれです。次の 3 つのファイルを紹介しましょう。
1. MasterPage.master、このファイルで注目すべき点は、CSS でシミュレートされた私の「DropDownList」です。「DropDownList」の各項目には LinkButton があり、各 LinkButtond の PostBackUrl の値は「 ~/ThemeTool. aspx?Theme=テーマ名" であるため、"DropDownList" オプションが変更されるたびに、新しいテーマ値が ThemeTool.aspx に渡され、ThemeTool.aspx が新しいテーマ値を処理してセッションに保存します。 。
2. App_Code フォルダーには ThemeSkin.cs ファイルがあり、GetTheme(Page P) と GetTheme(Page P) という 2 つの静的メソッドが含まれています。このメソッドは Web サイトにあります。テーマを持つ必要があるすべてのページの Page_PreInit() で呼び出されます (ここでは Default.aspx と Default2.aspx l) パラメーター P は、ページ タイプのオブジェクトであるメソッドを呼び出すページを参照します。 ChangeTheme() は、テーマの切り替えを ThemeTool.aspx.cs の Page_PreInit() で呼び出すために使用されます。
3. ルート ディレクトリの ThemeTool.aspx ページも非常に重要です。テーマの切り替えは、MasterPage に PreInit を実行しないように指示しました。内部のコードは非常に単純です。信じられない場合は、見てください。
拡大する