ASP.NET Web控件仅允许特定内容?

问题描述

| 我是ASP .NET Web控件的新手,但不是ASP.NET或C#的新手。 我想知道如何将允许的内容类型限制为特定的类。 我做了一个名为TabPanel的自定义Web控件,我希望它只能包含TabPages。 例如,以下标记应该是非法的,因为它包含一个复选框。
<cc1:TabPanel ID=\"TabPanel1\" runat=\"server\">
    <cc1:TabPage runat=\"server\">
        this is a simple test
    </cc1:TabPage>
    <cc1:TabPage runat=\"server\">
        this is another simple test
    </cc1:TabPage>
    <asp:CheckBox runat=\"server\" />
</cc1:TabPanel>
在这种情况下,我不希望该复选框存在。如何阻止这种情况发生?     

解决方法

我没有完全尝试过您想要的,但是根据我做过的其他事情,我将尝试以下操作: 在TabPannel中创建一个属性,该属性是TabPage的集合(出于演示目的,称为Tabs)。它可以是数组,列表或自定义集合类,关键是要键入以仅接受TabPage作为成员。 为属性分配[PersistenceMode(PersistenceMode.InnerProperty)]属性。 重写CreateChildControls可以将集合的内容添加到控件中。 如果您采用这种方式,那么您的标记最终应该看起来像这样:
<cc1:TabPanel ID=\"TabPanel1\" runat=\"server\">
    <Tabs>
        <cc1:TabPage runat=\"server\">this is a simple test</cc1:TabPage>
        <cc1:TabPage runat=\"server\">this is another simple test</cc1:TabPage>
    </Tabs>
</cc1:TabPanel> 
并且它不应允许将非TabPage的任何内容嵌套在Tabs属性内。 http://msdn.microsoft.com/zh-cn/library/9txe1d4x(v=VS.90).aspx是详细演示此技术的演练。     ,我想到了。 如果要添加的控件类型不是我想要的类型,则必须在我从WebControl重写的AddedControl过程下引发异常。 现在,设计师在控件本身上显示了一个漂亮的红色错误消息,使我无法做这样的愚蠢的事情。 太棒了!     ,我将在这里进行猜测,但是基于一些快速搜索,我认为您正在寻找ControlBuilder。该演示将他们的控件限制为一个名为“ mycell”的对象,但我看不出有什么理由不能将其限制为您自己的对象或内置的ASP.NET控件(例如Panels而不是文字框等) 作为最后的选择,我确定您可以劫持渲染方法,并且仅在预定的类集中渲染控件,但这似乎充其量是骇人的。