Значения данных контейнера не передаются с использованием шаблонного пользовательского элемента управления - PullRequest
0 голосов
/ 05 января 2012

Я создал шаблонный пользовательский элемент управления. Я не хочу раздувать этот пост, публикуя весь код, который я использовал для создания элемента управления, но достаточно сказать, что я совершенно уверен, что код правильный. Я опубликую несколько фрагментов, чтобы показать, что я знаю правильный способ сделать это. Во-первых, моя реализация 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 шаблонного элемента управления и что значения передаются в Placeholder через NamingContainer.

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

Label1.Text = NutritionalLabel_Template1.calories;

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

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

Thx

1 Ответ

0 голосов
/ 09 января 2012

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

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

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

...