在Master.FindControl之后,向Masterpage动态添加内容块失败

时间:2008-10-29 13:03:38

标签: c# asp.net master-pages itemplate

我遇到了一个对我没有任何意义的奇怪问题。我试图在页面上动态设置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不再呈现。

有没有人有任何想法为什么会这样......我无法对正在发生的事情做出正面或反面。

谢谢, 最大

1 个答案:

答案 0 :(得分:2)

问题是AddContentTemplate只是将其参数记录在哈希表中,以便在创建时与主页面实例结合使用。在创建母版页后调用它将不会执行任何操作,并且读取Master属性会导致创建母版页。

我可以看到的最好的方法是使用LoadControl创建一个单独的母版页实例,您可以在不影响页面自己的主属性的情况下进行检查...

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

创建第二个实例会有一些开销,但对我来说,它是否值得担心并不是很明显。