Dot-Net
有沒有辦法將內部控制項放入 ASP.NET 自定義控制項中?
我想做類似的事情(更新的例子):
<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 內容的 Controls 集合的末尾。
但是,如果您想擁有一組控制項,您可能應該使用伺服器控制項而不是使用者控制項。對於像這樣工作的控制項:
<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"); } } }和選項卡類:
public class Tab { public string CssClass { get; set; } public string Title { get; set; } }和選項卡集合:
public class TabCollection : Collection<Tab> { }