2012-01-05 48 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事件中對該方法進行顯式調用,以確保模板化控件和數據在這種情況下被綁定。