C# ASP.NET web控件仅允许特定内容?

C# ASP.NET web控件仅允许特定内容?,c#,asp.net,C#,Asp.net,我不熟悉ASP.NET web控件,但不熟悉一般的ASP.NET或C# 我想知道如何将允许的内容类型限制为特定的类 我制作了一个名为TabPanel的自定义web控件,我希望它只能包含TabPages 例如,以下标记应该是非法的,因为它包含一个复选框 <cc1:TabPanel ID="TabPanel1" runat="server"> <cc1:TabPage runat="server"> this is a simple test

我不熟悉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>

这是一个简单的测试
这是另一个简单的测试

在这种情况下,我不希望复选框出现。我怎样才能阻止这种情况发生呢?

我想在这里做个猜测,但根据一些猜测,我认为您正在寻找答案。演示将它们的控制限制在一个名为“mycell”的对象上,但我看不出有任何理由不能将其限制在您自己的对象上,或者内置ASP.NET控件(即面板而不是文本框等)

作为最后一种手段,我相信您可以劫持渲染方法,只渲染预定义类集中的控件,但这充其量只是一种黑客行为。

我发现了这一点

必须在AddedControl过程下引发异常,如果要添加的控件的类型不是我想要的类型,我将从WebControl重写该过程

现在,设计器在控件本身上显示了一条漂亮的红色错误消息,阻止我做这种愚蠢的事情


太棒了

我没有完全尝试过你想要的东西,但基于我所做的其他事情,我会尝试以下方法:

  • 在TabPannel中创建一个属性,该属性是TabPages的集合(出于演示目的称之为Tabs)。这可以是一个数组、一个列表或一个自定义集合类,关键是要键入以仅接受TabPages作为成员
  • 为属性指定[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属性中


这是一个详细演示此技术的演练

你的问题没有道理。@John:我的假设是他们正在编写一个自定义控件,并且不希望容器接受X类型的控件(在本例中是X=CheckBox),也许你应该更具建设性一点。这怎么说不通呢?我把问题的措辞改了一点。应该更详细。好的,如果你不想复选框在那里,不要放在那里。如果你说在某些情况下你不希望它存在,请解释这些是什么。隐藏复选框是否足够?还是要将其从控件集合中删除?您可以说TabPanel1.Controls.Remove(“idofcheckbox”);对于你想要移除它的条件。真的很有趣。不过,我最终还是选择了自己的答案。