1

OK マスター ページと、そのマスターを継承するネストされたマスター ページがあります。

すべてのページは、ネストされたマスター ページを実装します。

MasterPage
     --> NestedMaster
            --> Page1
            --> Page2
            --> etc.

そのため、最上位のマスター ページを動的に設定する必要があります。ヘッダーとヘッダーのみでレイアウトが完全に異なる 2 つのサイト。

これをコードで制御するにはどうすればよいですか? イベント階層を見ましたが、これはマスターページをページレベルでしか設定できないと言っているだけです。何千ものページがあります! これは実用的ではありません

NestedMasterページ レベルとそのレベルのみで 1 つの変更を加えたいと考えています。これはできますか?

私はもう試した:

protected override void OnInit(EventArgs e)
{
    this.MasterPageFile = getMasterPath();
    base.OnInit(e);
}

しかし、私はただ得ます:

「MasterPageFile」プロパティは、「Page_PreInit」イベント中またはその前にのみ設定できます。

マスター ページにはPreInitイベントがありません。

4

1 に答える 1

0

もう少しグーグルを行った後、基本クラスが でありPage、これが最初に呼び出されるため、PreInit を指定できる唯一の場所であるため、これは不可能であることがわかりました。神、私はウェブフォームが嫌いです。

つまり、 http://odetocode.com/Articles/450.aspxから解決策があると思います。基本的に、カスタム HTTPModule を生成します。

using System;
using System.Web;
using System.Web.UI;

public class MasterPageModule : IHttpModule
{  
    public void Init(HttpApplication context)
    {
        context.PreRequestHandlerExecute += new EventHandler(context_PreRequestHandlerExecute);
    }

    void context_PreRequestHandlerExecute(object sender, EventArgs e)
    {
        Page page = HttpContext.Current.CurrentHandler as Page;
        if (page != null)
        {
            page.PreInit +=new EventHandler(page_PreInit);
        }
    }

    void page_PreInit(object sender, EventArgs e)
    {
        Page page = sender as Page;
        if (page != null)
        {
            page.MasterPageFile = "~/Master1.master";
        }
    }

    public void Dispose()
    {
    }
} 
于 2012-08-17T10:27:49.260 に答える