容器数据值不是通过使用模板化用户控件来实现的

时间:2012-01-05 18:32:52

标签: asp.net controltemplate

我创建了一个模板化的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
{
}

我的模板标记有一个名为“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中设置的,并且这些值是通过NamingContainer传递给占位符的。

我还可以通过将以下代码放在网页的代码隐藏文件中来验证值的设置,然后查看页面上反映的值。但除此之外,没什么。

Label1.Text = NutritionalLabel_Template1.calories;

我之前看到过这个问题,并且不记得是什么原因或决议。任何人都可以提供任何指示吗?

我只创建了几次这些类型的控件,所以这对我来说有点新鲜。任何帮助,将不胜感激。我很难过。

THX

1 个答案:

答案 0 :(得分:0)

我从未收到任何对这篇文章的回复,所以无论为什么没有人能提供任何问题的线索,我都知道问题是什么,并认为我会为可能有类似问题的任何人发布解决方案除了你一些不必要的挫败感。 ; - )

事实证明我忘了将DataBind()方法添加到默认页面的Page_Load事件中。根据Microsoft,此方法可确保将数据从源绑定到服务器控件,并且在通过数据库查询检索数据集后通常会使用此方法。但由于大多数控件都会自动执行数据绑定,因此通常不需要对此方法进行显式调用。

但是,在创建自定义模板化数据绑定控件时,通常也会覆盖该方法。但就我而言,我在Templated控件中覆盖了PageInit;不是Databind方法。所以显然应该在调用页面的Page_Load事件中对该方法进行显式调用,以确保模板化控件和数据绑定在这种情况下。