我遇到了一个对我没有任何意义的奇怪问题。我试图在页面上动态设置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;
}
}
这很好用,除非我希望能够在调用AddContentTemplate之前仔细检查MasterPage上是否存在contentPlaceHolderID,因为如果添加指向不存在的ContentPlaceHolder的内容控件,页面将引发错误。 / p>
我遇到的问题是,在上面的示例中,当我调用一个注释的Master.FindControl行时,TextBox不再呈现。
有没有人有任何想法为什么会这样......我无法对正在发生的事情做出正面或反面。
谢谢, 最大
答案 0 :(得分:2)
问题是AddContentTemplate只是将其参数记录在哈希表中,以便在创建时与主页面实例结合使用。在创建母版页后调用它将不会执行任何操作,并且读取Master属性会导致创建母版页。
我可以看到的最好的方法是使用LoadControl创建一个单独的母版页实例,您可以在不影响页面自己的主属性的情况下进行检查...
MasterPage testMaster = (MasterPage) LoadControl( MasterPageFile );
Control c = testMaster.FindControl(existantContentPlaceHolderID);
创建第二个实例会有一些开销,但对我来说,它是否值得担心并不是很明显。