1

私には意味をなさない奇妙な問題に遭遇しました。ページに MasterPage コンテンツ コントロールを動的に設定しようとしています。次のコードでうまく機能しています。

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

        MasterPageFile = "~/MasterPages/Default.master";

        string existantContentPlaceHolderID = "ContentPlaceHolder1";
        string nonExistantContentPlaceHolderID = "foo";

        //Control c = Master.FindControl(existantContentPlaceHolderID);
        //Control c1 = Master.FindControl(nonExistantContentPlaceHolderID);

        TextBox t = new TextBox
                        {
                            Text = "Text"
                        };

        ITemplate iTemplate = new GenericITemplate(container => container.Controls.Add(t));

        AddContentTemplate(existantContentPlaceHolderID, iTemplate);

    }

    public delegate void InstantiateTemplateDelegate(Control container);

    public class GenericITemplate : ITemplate
    {
        private readonly InstantiateTemplateDelegate m_instantiateTemplate;

        public void InstantiateIn(Control container)
        {
            m_instantiateTemplate(container);
        }

        public GenericITemplate(InstantiateTemplateDelegate instantiateTemplate)
        {
            m_instantiateTemplate = instantiateTemplate;
        }
    }

存在しない ContentPlaceHolder を指すコンテンツ コントロールを追加すると、ページがエラーをスローするため、AddContentTemplate を呼び出す前に、MasterPage に contentPlaceHolderIDs が存在することを再確認できるようにしたいことを除けば、これはうまく機能します。

私が抱えている問題は、上記の例で、コメント化された Master.FindControl 行のいずれかを呼び出すと、TextBox がレンダリングされなくなることです。

これがなぜなのか、誰か考えがありますか...何が起こっているのか頭も尻尾もわかりません。

ありがとう、マックス

4

1 に答える 1

2

問題は、AddContentTemplate が作成時にマスター ページ インスタンスと組み合わせる準備ができているハッシュテーブルにパラメーターを記録するだけであることです。マスター ページが作成された後に呼び出しても何も実行されず、Master プロパティを読み取るとマスター ページが作成されます。

これを回避する最善の方法は、LoadControl を使用してマスター ページの別のインスタンスを作成することです。これにより、ページ自体の Master プロパティに影響を与えずに検査できます...

MasterPage testMaster = (MasterPage) LoadControl( MasterPageFile );
Control c = testMaster.FindControl(existantContentPlaceHolderID);

2 番目のインスタンスの作成には多少のオーバーヘッドがありますが、心配する価値があるかどうかはすぐにはわかりません。

于 2008-10-29T15:27:50.403 に答える