自定义控件的Controls.Count Zero

时间:2010-01-06 22:57:33

标签: c# asp.net custom-controls

在自定义服务器控件中,我只是写出子控件的数量。

如果< %%>是否有理由将计数归零标签是在控制标签的主体内使用的吗?

这是我非常简化的控制:

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

}

当仅传递Literal数据时,写入的计数按预期为1:

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

当传递Literal数据和一些计算数据时,计数变为零:

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

String.Empty也没什么特别之处。我放在这里的任何东西都会导致数量为零。

有趣的是,其他Control标签可以正常工作。以下计数3:

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

是否有其他方法可以让儿童获得自定义控件的“内容”?我认为有一些方法,就像它一样,但我只能检查System.Web.UI.WebControls.Content的元数据 - 而不是实现。

2 个答案:

答案 0 :(得分:4)

如果您的控件在正文中有Controls个标记,则无法修改<%%>集合(如果您尝试Add某些内容,那么您会得到异常解释)。出于同样的原因,Controls集合实际上是空的。您可以使用<%%>属性检查集合是否为空,因为Controls.IsReadOnly标记。

答案 1 :(得分:1)

事实证明,答案比我首先采用的方法简单得多。只需使用您自己的HtmlTextWriter调用重写的RenderControl方法,然后根据需要使用捕获的标记。

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

现在渲染的标记在htmlString中可用,无论&lt; %%&gt;控件体内使用的标签。