在ServerControl标记中添加子控件?

Moh*_*yan 2 c# asp.net servercontrols menu

我正在开发导航菜单.
我在ServerControl下面创建它可以工作,但我希望允许用户在我的ServerControl标签中添加一些标准的ASP.NET控件label,image等等.

<MdsMenu:ServerControlMenu ID="ServerControlMenu1" runat="server">
  <MdsMenu:animation AnimationSpeed="Normal" AnimationType="Opacity_Height" Delay="1000" DropShadow="true" />
    <!-- HERE HAS TO HAVE SOME STANDARD ASP.NET CONTROLS -->
    <!-- e.g <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label> -->
  </MdsMenu:MenuItem>
</MdsMenu:ServerControlMenu>
Run Code Online (Sandbox Code Playgroud)

我的问题在于我如何获得Child Controls <MdsMenu:MenuItem>并将它们显示为输出中的.

PS:
我覆盖了RenderContents方法

protected override void RenderContents(HtmlTextWriter output)
{ 
   output.Write(OutPutStringBuilder.ToString()); 
}
Run Code Online (Sandbox Code Playgroud)

cdh*_*wie 10

我想你只需要抛出[ParseChildren(false), PersistChildren(true)]代表<MdsMenu:MenuItem/>标签的类.然后,在控件的Controls属性中,运行时可以使用在标记内写入的子控件.

更新:我汇总了一个快速测试项目,以证明这确实有效.(显然人们喜欢在没有实际评估答案是否正确的情况下进行投票.)

此自定义控件具有您期望的行为:

[ParseChildren(false), PersistChildren(true)]
public partial class SuperDiv : System.Web.UI.UserControl
{
    public override void RenderControl(HtmlTextWriter writer)
    {
        writer.Write("<div class=\"super\">");
        writer.Write(Controls.Count);

        foreach (Control i in Controls)
            i.RenderControl(writer);

        writer.Write("</div>");
    }
}
Run Code Online (Sandbox Code Playgroud)

所以下面的ASP.NET标记:

<test:SuperDiv runat="server">
    <asp:Label runat="server">Hello, World!</asp:Label>
</test:SuperDiv>
Run Code Online (Sandbox Code Playgroud)

将导致呈现以下HTML:

<div class="super">3
    <span>Hello, World!</span>
</div>
Run Code Online (Sandbox Code Playgroud)

(3因为只包含空格的两个文本节点也是控件的子节点,以及标签.)

  • @Letseatlunch - 请参阅文档的备注部分:http://msdn.microsoft.com/en-us/library/system.web.ui.persistchildrenattribute.aspx PersistChildrenAttribute与ParseChildrenAttribute结合使用以确定嵌套内容的方式控制的解释.如果PersistChildrenAttribute为true且ParseChildrenAttribute为false,则ASP.NET服务器控件中包含的嵌套内容将作为控件保留.如果PersistChildrenAttribute为false且ParseChildrenAttribute为true,则嵌套内容将作为服务器控件的属性保留. (2认同)