如何在不声明模板标签的情况下对孩子进行控制?

Bru*_*oLM 6 .net c# asp.net controls controltemplate

我想创建一个像一个控件Panel.

我希望我的控件接受一些控件作为孩子而不键入模板名称,就像Panel,如下所示:

<asp:Panel runat="server">
    My content
    <div>Content</div>
</asp:Panel>
Run Code Online (Sandbox Code Playgroud)

我有内容控件,而不知道是什么ITemplate.

我基本上想转换它

<my:MyControl runat="server">
    <ContentTemplate>
        My content
        <div>Content</div>
    </ContentTemplate>
</my:MyControl>
Run Code Online (Sandbox Code Playgroud)

进入这个

<my:MyControl runat="server">
    My content
    <div>Content</div>
</my:MyControl>
Run Code Online (Sandbox Code Playgroud)

这是我得到的:

public class MyControl : CompositeControl
{
    [TemplateInstance(TemplateInstance.Single)]
    public ITemplate Content { get; set; }

    protected override void CreateChildControls()
    {
        base.CreateChildControls();

        Content.InstantiateIn(this);
    }
}
Run Code Online (Sandbox Code Playgroud)

以上工作与<Content></Content>控件内的标签,但没有它不起作用.该属性根本没有做任何事情(我猜).少了什么东西?

我怎样才能实现它?任何提示?为什么Panel支持这个?

Mar*_*ahl 7

我正在从内存中写这个,但我相信答案很简单,就是用ParseChildrenAttributePersistChildrenAttribute属性来装饰你的控件类,你不需要像你提议的那样使用模板.

ParseChildrenAttribute.ChildrenAsProperties指定解析器是否应将控件标记的嵌套内容视为属性.将此设置为false将使解析器不会尝试将标记映射到属性名称.

PersistChildrenAttribute将告诉解析器将嵌套内容视为控件,解析后的控件将作为子控件添加到自定义面板控件中.

您的控件代码将如下所示:

[ParseChildren(false)]
[PersistChildren(true)]
public class MyControl : CompositeControl 
{
    public override void RenderBeginTag(HtmlTextWriter writer)
    {
        base.RenderBeginTag(writer); // TODO: Do something else here if needed
    }     

    public override void RenderEndTag(HtmlTextWriter writer)
    {
        base.RenderEndTag(writer); // TODO: Do something else here if needed
    }
} 
Run Code Online (Sandbox Code Playgroud)

作为参考,您可以启动.NET Reflector并查看Panel控件的实现.