9

さて、ページの OnPreInit イベントでマスター ページを動的に変更することについては、誰もが知っていることです。

しかし、入れ子になったマスター ページはどうでしょうか。マスターのマスターを変更できますか?

MasterPage クラスで公開される OnPreInit イベントはありません。

何か案は?

4

4 に答える 4

9

これをテストしたところ、ネストされたMasterPageを使用しているページのPreInitから機能します。

protected void Page_PreInit(object sender, EventArgs e)
{
    this.Master.MasterPageFile = "/Site2.Master";
}

明らかに、交換するページ全体で ContentPlaceholderIds が一貫していることを確認する必要があります。

于 2009-02-24T14:52:38.270 に答える
3

Andy のメソッドを「BasePage」クラスと組み合わせます。System.Web.UI.Page から継承するクラスを作成し、すべてのページがこのクラスから継承します。

次に、基本ページ クラスで、関連するチェックを実行して、どのルート マスター ページを使用する必要があるかを確認できます。この場合、「プレゼンテーション」マスターと「オーサリング」マスターがあります。一方、オーサリング マスターには、オーサリング ツール用の追加の JS がいくつかあり、CSS は軽量で、ナビゲーションはありません (サイト レイアウトを変更するのではなく、ユーザーが実際にページをオーサリングするときに使用するものです)。

次に、この基本ページは Page.Master.MasterPageFile を呼び出して、それがページの正しい状態である場合、オーサリング マスターに設定できます。

于 2009-03-02T00:20:58.190 に答える
2

Andy のコードを試すときに、誰かがこれに出くわし、「コンテンツ コントロールは、マスター ページを参照するコンテンツ ページまたはネストされたマスター ページのトップレベル コントロールである必要がありますthis.Master」というエラーで髪を引き裂いた場合に備えて、 . したがって、コードは次のようになります。

protected void Page_PreInit(object sender, EventArgs e)
{
    MasterPageFile = "/Site2.Master";
}

編集Zhaph が以下で指摘しているように、私が持っているコード ^^ マスターのマスターではなく、現在のページのマスターのみを変更します。これは、Hainesy が「マスター ページを動的に変更することは誰もが知っている」と述べたときに話していたコードです(私は知りませんでした)。「 stackoverflow change master page 」をグーグルで検索してこのページにたどり着いた場合(これは私がやったことです)、これはおそらくあなたが探しているコードです:-)

于 2009-05-14T08:13:39.633 に答える
0

Zhaph - Ben Duguid の回答に追加するには (ちなみに +1):

入れ子になったマスター ページのマスター ページを設定するコード例を次に示します。すべてのページはこの BasePage から継承されるため、このコードは 1 か所にのみ存在します。

public class BasePage : System.Web.UI.Page
{
    private void Page_PreInit(object sender, System.EventArgs e)
    {
        if (Request.Browser.IsMobileDevice)
        {
            if (Page.MasterPageFile == "~/master/nested.master")) 
            {
                Page.Master.MasterPageFile = "~/master/mobile.master";
            } 
            else 
            {
                MasterPageFile = "~/master/mobile.master";
            }
        }
    }
}
于 2010-11-16T17:31:29.007 に答える