代码之家  ›  专栏  ›  技术社区  ›  James Maroney

自定义控件的控件。计数为零

  •  4
  • James Maroney  · 技术社区  · 16 年前

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

    如果在控件标记的主体中使用了<%%>标记,是否有原因使计数变为零?

    这是我极其简化的控制:

    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>
    

    这根绳子没什么特别的,也没什么特别的。我在这里放的任何东西都会导致一个零的计数。

    有趣的是,其他的控制标签工作得很好。以下计数3:

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

    是否有其他方法来获取自定义控件的子“内容”?我认为有某种方法,就像它一样,但我只能检查system.web.ui.webcontrols.content的元数据,而不能检查实现。

    2 回复  |  直到 16 年前
        1
  •  4
  •   Pent Ploompuu    16 年前

    无法修改 Controls 如果控件具有 <%%> 身体上的标签(如果你试图 Add 一些事情,然后你会得到一个例外解释。出于同样的原因, 控制 集合实际上是空的。您可以检查集合是否为空,因为 <%%gt; 标签使用 Controls.IsReadOnly 财产。

        2
  •  1
  •   James Maroney    16 年前

    结果发现,答案比我最初采用的方法简单得多。只需使用自己的htmltextWriter调用重写的renderControl方法,然后根据需要使用捕获的标记。

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

    现在,呈现的标记在htmlstring中可用,而不管控件的主体中使用的标记是什么。