私には意味をなさない奇妙な問題に遭遇しました。ページに 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 がレンダリングされなくなることです。
これがなぜなのか、誰か考えがありますか...何が起こっているのか頭も尻尾もわかりません。
ありがとう、マックス