9

私は、実行時に変更可能な 2 つ以上の外観をサポートできるようにする必要があるサイトに取り組んでいます。CSS スイッチで変更を処理できるようにしたかったのですが、デザインごとに異なるマスターページを使用する必要があるようです。

では、実行時にマスターページを設定する最良の方法は何ですか? Page.MasterPageFile は、Page.OnPreInit イベントでのみ設定できます。解決策は、PreInit イベントを処理する共通のベースからすべてのページを継承させるか、それを行う HttpModule を使用することです。

何かアドバイス?

4

6 に答える 6

6

私はこれを以前に一度行ったことがあります.私はあなたが説明したことを正確に行いました(OnPreInitイベントですべてのページをカスタムページから継承させました). また、別のマスター ページを必要としない画像/css の変更を行うための Page.StyleSheetTheme を設定するために、Global.asax.cs にカスタム Application_PreRequestHandlerExecute がありました。

于 2008-08-18T21:22:01.363 に答える
2

2 つの異なるマスター ページではなく、異なるユーザー コントロールとコンテンツの HTML リテラルを動的に読み込む 1 つのマスターを用意するのはどうでしょうか?

于 2008-08-18T21:19:30.230 に答える
2

あなたの痛みが分かります。これに関する問題を約1時間(それ以上ではないにしても)検索しましたが、成功しませんでした。何百ページもある場合、「各ページで PreInit から呼び出すだけ」と言うのは、単純な答えではありません。しかし、その後、各ページで解決策を探すよりも、解決策を探すのに多くの時間を費やしていることに気付きました.

しかし、私は Profile プロパティに基づいて MasterPageFile を設定したかったので、各ページに約 5 行のコードが必要であり、保守性の悪夢でした。とにかく、「同じことを繰り返さないで」ですよね?

そこで、App_Code フォルダー内のモジュールに Extension メソッドを作成して、これをより簡単かつ保守しやすくしました。

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

そして、各ページの PreInit で、次のように呼び出します。

Protected Sub Page_PreInit(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreInit
        Me.SetMaster()
    End Sub
于 2009-02-23T17:24:16.043 に答える
1

PreInit を処理し、適切なマスター ページを読み込むために必要な 1 行のコードを挿入するのは簡単です。

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

このルートに行かないやむを得ない理由がない場合は、PreInit をどこで処理するかに関係なく、私はそうします。

于 2008-08-18T21:24:43.637 に答える
0

ページがどのように見えるべきかを決定するものに興味がありますか? ボタンをクリックしてテーマを変更するのはユーザーですか? サイトへのアクセスに使用された URL に基づいていますか?

コード ビハインドはマスター ページでサポートされているため、1 つのマスター ページに何を表示するかを決定するロジックを配置できます。

ユーザーのクリックに基づいて (フォント サイズやページ幅を変更するために) Cookie を設定し、それらの Cookie の値に基づいて異なる CSS ファイルを適用するサイトをいくつか見てきました。Cookie が存在しない場合は、デフォルトのルック アンド フィールを表示します。

編集:

ここでもう 1 つ考えられるのは、単純に CSS を切り替えようとしている場合は、スタイル タグをサーバーで実行するように設定し、実行時にそれにプロパティを割り当てることです。この場合も、1 つのマスター ページを使用し、コードをマスター ページのコード ビハインド (おそらく PreInit イベント ハンドラー) に配置する必要があります。

このソリューションを実装したことがないので、 <HEAD> タグ全体をサーバーで実行する必要があるかどうかはわかりません。


<html>
<head id="Head" runat="server">
<style id="StylePlaceholder" runat="server" type="text/css"></style>
</head>
于 2008-08-18T21:46:40.877 に答える