Динамическое добавление блоков контента на мастер-страницу завершается неудачно после 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);
При создании второго экземпляра есть некоторые накладные расходы, но для меня не сразу очевидно, стоит ли беспокоиться об этом.