2012-01-05 4 views
0

Я создал шаблонный UserControl. Я не хочу раздувать это сообщение, публикуя весь код, который я использовал для создания элемента управления, но достаточно сказать, что я уверен, что код верен. Я опубликую несколько фрагментов, чтобы показать, что я знаю правильный способ сделать это. Во-первых мой ITemplate реализация:Значения данных контейнера не проходят через шаблонный пользовательский элемент управления

private ITemplate _NutritionLabelTemplate = null; 
[TemplateContainer(typeof(NutritionLabelContainer))] 
[PersistenceMode(PersistenceMode.InnerProperty)] 
public ITemplate NutritionLabelTemplate 
{ 
    get { return _NutritionLabelTemplate; } 
    set { _NutritionLabelTemplate = value; } 
} 

Тогда реализация моего INamingContainer интерфейса:

public class NutritionLabelContainer : Control, INamingContainer 
{ 
} 

Мой шаблон разметки имеет контроль Placeholder под названием «phNutritionLabel_Template» и режущую через другой бла-бла-бла, я» ве получил что-то вроде:

phNutritionLabel_Template.Controls.Clear(); 
if (NutritionLabelTemplate != null) 
{ 
    NutritionLabelContainer nContainer = new NutritionLabelContainer(); 
    nContainer.calcium = calcium; 
    nContainer.calories = calories; 

    NutritionLabelTemplate.InstantiateIn(nContainer); 
    phNutritionLabel_Template.Controls.Add(nContainer); 
} 

После этого я добавляю этот шаблонный UserControl к моей веб-странице и проверить его добавить следующий код:

<uc1:NutritionalLabel_Template ID="NutritionalLabel_Template1" runat="server" 
    servingSize="28" 
    calories="46"> 
    <NutritionLabelTemplate> 
     <h1>Template Calories</h1> 
     <span style="font-size:large; font-style:italic;"></span> 
     <asp:Label ID="Label1" runat="server"> 
     <%#Container.calories %> 
     </asp:Label> 
     <br /> 
    </NutritionLabelTemplate> 
    </uc1:NutritionalLabel_Template> 

Когда я запустил страницу, значение # Container.calories не видно, оно полностью пустое. Я отлаживал свой код и проходил через него. Я вижу, что значения явно устанавливаются в NamingContainer Templated Control и что значения переносятся на Placeholder через NamingContainer.

Я также могу проверить, что значения установлены, поместив следующий код в файл с кодом на веб-странице, а затем увидите значения, отраженные на странице. Но в остальном ничего.

Label1.Text = NutritionalLabel_Template1.calories; 

Я видел, что эта проблема возникает раньше и не может запомнить, в чем причина или разрешение. Может ли кто-нибудь предоставить какие-либо указатели?

Я несколько раз создавал эти типы элементов управления, поэтому для меня это немного ново. Любая помощь будет оценена по достоинству. Я упал.

Thx

ответ

0

Я никогда не получал никаких ответов на этот пост так независимо от того, почему никто не может предоставить какие-либо ключи к этой проблеме, я понял, что проблема была и думал, что я отправлю решение для тех, кто может потенциально имеют подобную проблему, чтобы избавить вас от ненужного разочарования. ;-)

Оказывается, я забыл добавить метод DataBind() к событию Page_Load страницы по умолчанию. Для Microsoft этот метод обеспечивает привязку данных от источника к серверному элементу управления и обычно используется после извлечения набора данных через запрос базы данных. Но поскольку большинство элементов управления автоматически выполняют привязку данных, вам обычно не нужно явно обращаться к этому методу.

Однако этот метод также обычно переопределяется при создании настраиваемого шаблона с привязкой к данным. Но в моем случае я переопределил параметр PageInit в Templated control; а не метод Databind. Таким образом, очевидно, что должен быть сделан явный вызов методу в событии Page_Load вызывающей страницы, чтобы гарантировать, что шаблонный контроль и данные будут связаны в этом случае.

Смежные вопросы