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支持这个?
我正在从内存中写这个,但我相信答案很简单,就是用ParseChildrenAttribute和PersistChildrenAttribute属性来装饰你的控件类,你不需要像你提议的那样使用模板.
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控件的实现.
| 归档时间: |
|
| 查看次数: |
2138 次 |
| 最近记录: |