2012-01-05 47 views
0

我已经创建了模板用户控件。我不想通过发布所有用于创建控件的代码来膨胀这篇文章,但足以说我确信代码是正确的。我将发布一些片段,以表明我确实知道这样做的正确方法。首先是我的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); 
} 

后来,我这个模板用户控件添加到我的网页,并测试它,我添加以下代码:

<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

回答

0

我从来没有收到这个帖子任何反应所以不管为什么没有人能提供任何线索的问题,我想通了什么问题了,我想我会发布的解决方案的人谁可能可能有类似的问题,以节省您一些不必要的挫折。 ;-)

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

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