2010-01-06 14 views
4

在自定義服務器控件中,我只是寫出了子控件的數量。自定義控件的Controls.Count零

如果在控件標籤的主體內使用<%%>標籤,是否有計數會變爲零的原因?

這是我極爲簡化的控制:

public class Script : Control 
{ 
    public override void RenderControl(HtmlTextWriter writer) 
    {    
     writer.Write(this.Controls.Count.ToString()); 
    } 

} 

當傳遞只包含文字數據,寫入的次數爲1的預期:

<my:Script runat="server" ID="script3" > 
    function foo(){} 
</my:Script> 

當傳遞文字數據和部分計算數據,計數雲歸零:

<my:Script ID="Script1" runat="server" > 
    function foot(){} 
    <%=String.Empty %> 
</my:Script> 

String.Empty ei沒有什麼特別之處療法。我在這裏放的任何東西都會導致計數爲零。

有趣的是,其他控件標籤卻能正常工作。以下計數3:

<my:Script runat="server" ID="Script2"> 
    hi 
    <asp:HyperLink runat="server" NavigateUrl="/" Text="hi" /> 
</my:Script> 

是否有另一種方法來獲取自定義控件的子內容?我認爲有一些方法,因爲它,但我只能檢查System.Web.UI.WebControls.Content的元數據 - 而不是實現。

+0

爲了以防萬一它有助於解決我的問題,我期待構建一個控件,它可以在我的視圖和局部視圖中累積javascript片段,並允許我一次性將它們全部轉儲到最終呈現頁面的底部(在內核之後庫已經加載)。 – 2010-01-07 21:52:41

回答

1

原來,答案比我首先採取的方法簡單得多。只需使用您自己的HtmlTextWriter調用重寫的RenderControl方法,然後使用捕獲的標記即可。

var htmlString = new StringBuilder(); 
var mywriter = new HtmlTextWriter(new StringWriter(htmlString)); 
base.RenderControl(mywriter); 

現在所呈現標記可在htmlString,無論<%%>在控件的身體使用的標籤。

4

如果您的控件在正文中有<%%>標籤(如果您嘗試Add某件事,那麼您會得到解釋此異常的例外情況),則無法修改Controls集合。出於同樣的原因,Controls集合實際上是空的。您可以使用Controls.IsReadOnly屬性檢查收藏是否爲空,因爲<%%>標記。