Динамическое добавление блоков контента на мастер-страницу завершается неудачно после Master.FindControl

Я столкнулся со странной проблемой, которая не имеет никакого смысла для меня. Я пытаюсь динамически настроить элементы управления содержимым 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;
        }
    }

Это прекрасно работает, за исключением того, что я хочу иметь возможность перепроверить, что contentPlaceHolderIDs существуют на MasterPage перед вызовом AddContentTemplate, так как Page выдает ошибку, если вы добавляете элемент управления Content, который указывает на несуществующий ContentPlaceHolder.

У меня проблема в том, что в приведенном выше примере, когда я вызываю одну из прокомментированных строк Master.FindControl, TextBox больше не визуализируется.

У кого-нибудь есть идеи, почему это может быть... Я не могу понять, что происходит.

Спасибо Макс

1 ответ

Решение

Проблема в том, что AddContentTemplate просто записывает свои параметры в хеш-таблицу, готовую к объединению с экземпляром главной страницы при его создании. Вызов его после создания главной страницы ничего не изменит, а чтение свойства Master приведет к созданию главной страницы.

Лучший способ увидеть это - создать отдельный экземпляр главной страницы с помощью LoadControl, который вы можете просматривать, не затрагивая собственное свойство Master страницы...

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

При создании второго экземпляра есть некоторые накладные расходы, но для меня не сразу очевидно, стоит ли беспокоиться об этом.

Другие вопросы по тегам