0

ASP.NET/C# 4.0 を使用して、答えを見つけることができなかった非常に奇妙な問題があります。子マスター ページ用のカスタム ベース マスター ページと、ページ用のカスタム ベース ページ クラスがあります。私の問題は、自分のページのいずれかからマスター メンバーにアクセスすると、ページ コンテンツ自体がレンダリングされず、マスター ページだけがレンダリングされることです。

したがって、別の方法で要約すると、「マスター ページ」は System.Web.UI.MasterPage を継承します 「マスター ページ」を使用する「ネストされたマスター」は System.Web.UI.MasterPage を継承します

「ネストされたマスター」を使用する「WebForm」、WebForm は System.Web.UI.Page を継承する CustomPageBase を継承しています。

CustomBaseMaster が this.Master にアクセスすると、Web フォームのコンテンツはレンダリングされず、「ネストされたマスター」と「マスター ページ」のコンテンツのみがレンダリングされます。メンバーの読み取りのみ、メンバーの書き込み、読み取りと書き込みの両方、メンバーにアクセスすることさえせず、Debug.WriteLine(this.Master) を呼び出すだけで試しました。

それが役立つ場合は、「マスターページ」のコントロールを更新する必要がある「WebForm」でページデコレーターを使用しています

残念ながら、私の Google 検索クエリには、マスター ページのパブリック メンバーにアクセスする方法に関する結果が表示されます。しかし、マスターページにアクセスすると、ページのコンテンツが表示されない理由を説明するのに役立つものは何も見つかりませんでした。

誰かがそのようなものを見たことがあり、何か提案を提供できますか? Google はあまり役に立ちませんでした。数時間検索していました。

4

1 に答える 1

0

クラスの先頭で Page デコレータを使用すると、PreInit が完了する前にページ クラスのプロパティが割り当てられます。ILSpy を使用して、ページの Master プロパティにアクセスするとどうなるかを調べました。マスター ページが作成される前 (内部的には null) で、すべての PreInit メソッドが呼び出される前にアクセスされた場合、新しいマスター ページが作成されます。そのコンテンツを使用します。ちょっと面倒。とにかく、私の解決策は、値を取得および設定するときにプロパティが値を親マスターページにバブルアップさせないようにすることでしたが、ベースページとベースマスタークラスで OnLoad イベントをオーバーロードし、そこに親のプロパティを設定しました。

したがって、これを行う代わりに:

namespace MyWebsite
{
    public abstract class MyPageBase : Page
    {
        public int PropertyName
        {
            get
            {
                return ((MyMaster)this.Master).RatePageId;
            }
            set
            {
                ((MyMaster)this.Master).RatePageId;
            }
        }
    }
}

これは私がしました:

namespace MyWebsite
{
    public abstract class MyPageBase : Page
    {
        public int? PropertyName
        {
            get;
            set;
        }

        protected override void OnInit(EventArgs e)
        {
            base.OnInit(e);

            if (PropertyName != null)
            {
                ((MyMaster)this.Master).PropertyName = PropertyName.Value;
            }
        }
    }
}
于 2012-07-10T16:05:42.987 に答える