Dot-Net

有沒有辦法將內部控制項放入 ASP.NET 自定義控制項中?

  • November 29, 2011

我想做類似的事情(更新的例子):

<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>

可能的?有什麼教程或操作方法嗎?我不確定要搜尋什麼或這叫什麼,所以到目前為止還沒有找到任何東西。內部控制?內藏什麼東西……?

使用ParseChildrenAttributePersistChildrenAttribute屬性:

[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> { }

引用自:https://stackoverflow.com/questions/604620