在自定义服务器控件中,我只是写出子控件的数量。
如果< %%>是否有理由将计数归零标签是在控制标签的主体内使用的吗?
这是我非常简化的控制:
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的元数据 - 而不是实现。
答案 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;控件体内使用的标签。