问题描述
|
我是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而不是文字框等)
作为最后的选择,我确定您可以劫持渲染方法,并且仅在预定的类集中渲染控件,但这似乎充其量是骇人的。