さて、ページの OnPreInit イベントでマスター ページを動的に変更することについては、誰もが知っていることです。
しかし、入れ子になったマスター ページはどうでしょうか。マスターのマスターを変更できますか?
MasterPage クラスで公開される OnPreInit イベントはありません。
何か案は?
さて、ページの OnPreInit イベントでマスター ページを動的に変更することについては、誰もが知っていることです。
しかし、入れ子になったマスター ページはどうでしょうか。マスターのマスターを変更できますか?
MasterPage クラスで公開される OnPreInit イベントはありません。
何か案は?
これをテストしたところ、ネストされたMasterPageを使用しているページのPreInitから機能します。
protected void Page_PreInit(object sender, EventArgs e)
{
this.Master.MasterPageFile = "/Site2.Master";
}
明らかに、交換するページ全体で ContentPlaceholderIds が一貫していることを確認する必要があります。
Andy のメソッドを「BasePage」クラスと組み合わせます。System.Web.UI.Page から継承するクラスを作成し、すべてのページがこのクラスから継承します。
次に、基本ページ クラスで、関連するチェックを実行して、どのルート マスター ページを使用する必要があるかを確認できます。この場合、「プレゼンテーション」マスターと「オーサリング」マスターがあります。一方、オーサリング マスターには、オーサリング ツール用の追加の JS がいくつかあり、CSS は軽量で、ナビゲーションはありません (サイト レイアウトを変更するのではなく、ユーザーが実際にページをオーサリングするときに使用するものです)。
次に、この基本ページは Page.Master.MasterPageFile を呼び出して、それがページの正しい状態である場合、オーサリング マスターに設定できます。
Andy のコードを試すときに、誰かがこれに出くわし、「コンテンツ コントロールは、マスター ページを参照するコンテンツ ページまたはネストされたマスター ページのトップレベル コントロールである必要がありますthis.Master
」というエラーで髪を引き裂いた場合に備えて、 . したがって、コードは次のようになります。
protected void Page_PreInit(object sender, EventArgs e)
{
MasterPageFile = "/Site2.Master";
}
編集Zhaph が以下で指摘しているように、私が持っているコード ^^ マスターのマスターではなく、現在のページのマスターのみを変更します。これは、Hainesy が「マスター ページを動的に変更することは誰もが知っている」と述べたときに話していたコードです(私は知りませんでした)。「 stackoverflow change master page 」をグーグルで検索してこのページにたどり着いた場合(これは私がやったことです)、これはおそらくあなたが探しているコードです:-)
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";
}
}
}
}