我想做一些类似(更新的例子):
<uc:Tabs> <Tab Name="A handy tab"> <Node Url="~/Default.aspx" /> <Node Url="~/Node2.aspx" /> </Tab> <Tab Name="Another handy tab"> <Node Url="~/Neato.aspx" /> <Node Url="~/Node3.aspx" /> <Node Url="~/Node4.aspx" /> </Tab> <uc:Tabs>
解决方法
使用
ParseChildrenAttribute和
PersistChildrenAttribute属性:
[ParseChildren(false)] [PersistChildren(true)] public class MyControl : UserControl { }
这将导致您在引用中放置任何控件:
<uc:MyControl runat="server"> <asp:TextBox runat="server" /> <uc:MyControl>
附加到UserControl内容的控件集合的末尾.
但是,如果要设置控件集合,则应该使用服务器控件而不是用户控件.对于像这样的控件:
<foo:TabControl runat="server"> <Tabs> <foo:Tab CssClass="myclass" Title="Hello World" /> </Tabs> </foo:TabControl>
您需要具有Tabs属性的Control类; Tabs属性应该是一个集合;它应该包含Tab类型的对象.我在这里创建了三个类:
[ParseChildren(true,"Tabs")] public class TabControl: WebControl,INamingContainer { private TabCollection _tabs; [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] [PersistenceMode(PersistenceMode.InnerDefaultProperty)] public TabCollection Tabs { get { if (_tabs == null) { _tabs = new TabCollection(); } return _tabs; } } protected override void Render(HtmlTextWriter writer) { foreach (Tab tab in Tabs) { writer.WriteBeginTag("div"); writer.WriteAttribute("class",tab.CssClass); writer.Write(HtmlTextWriter.TagRightChar); writer.Write("this is a tab called " + tab.Title); writer.WriteEndTag("div"); } } }
和tab类:
public class Tab { public string CssClass { get; set; } public string Title { get; set; } }
和标签集合:
public class TabCollection : Collection<Tab> { }