分享
 
 
 

ASP.NET 2.0服务器控件开发之复杂属性

王朝asp·作者佚名  2006-11-24
窄屏简体版  字體: |||超大  

上一篇文章中,曾经提及“复杂属性”的概念。复杂属性的最大特征是属性的类型是本身具有属性(称为子属性)的类。通常情况下,复杂属性表现为3种形式:连字符形式属性、内部嵌套形式属性和内部嵌套形式默认属性。本文将介绍以上3种形式复杂属性的具体实现方法。

1. 实现连字符形式复杂属性

连字符形式属性是比较常见的复杂属性。我们常用的Font属性就是一个复杂属性,其包括多个子属性,如Bold、Name等。这种类型属性具有两种语法格式:一种是利用连字符语法,在控件的开始标记中保存子属性,例如,Font-Bold,Font-Name。另外一种格式是在控件的标记中保存子属性,例如,<font Bold="true" />。后者比前者的可读性强。

实现连字符形式的复杂属性,必须对该复杂属性及其子属性实现设置指定的设计时元数据。下面首先列举了复杂属性实现过程中的相关元数据设置示例。请阅读下面的源代码。

public class CustomerControl:WebControl{

[ DesignerSerializationVisibility( DesignerSerializationVisibility.Content), NotifyParentProperty(true) ]

public SizeInfo Size { ...... }

}

如上代码所示,Size是一个复杂属性,其属性类型为SizeInfo(自定义类)。在Size属性实现前设置了两个设计时元数据:DesignerSerializationVisibility和NotifyParentProperty。DesignerSerializationVisibility用于指定在设计时序列化组件上的属性时,所使用的持久性类型。其值设置为DesignerSerializationVisibility.Content枚举值,用于指定序列化程序应该序列化属性的内容即子属性,而不是Size属性本身,因为序列化Size没有任何意义。另外,还包括一个NotifyParentProperty(true)设置,它的作用是使得属性浏览器中对子属性的修改通知一直上传到对象模型,并在被修改了子属性的控件中产生修改通知。

在完成了复杂属性的元数据设置后,开发人员还必须对子属性设置相关的设计时元数据。例如,Size包括两个子属性Height和Width,那么它们的实现代码应如下所示。

[TypeConverter(typeof(ExpandableObjectConverter))]public class SizeInfo{

[ NotifyParentProperty(true) ]

public UInt32 Height {......}

[ NotifyParentProperty(true) ]

public UInt32 Width {......}

}

如上代码所示,子属性Height和Width分别被设置了元数据NotifyParentProperty(true)。这样,当子属性发生修改时,.NET框架将自动产生修改通知,并且通知到父属性Size。另外,还有一个设计时特性TypeConverter(typeof(ExpandableObjectConverter)),它告诉属性浏览器提供扩展和折叠样式,这样控件开发者可以在属性浏览器中直接编辑子属性。

以上介绍了声明连字符形式属性的方法。从中可以看出,在声明连字符属性过程中需要把握两个要点:一是复杂属性的设计时元数据设置;二是子属性的设计时特性设置。

2. 实现内部嵌套形式复杂属性

通常情况下,开发人员多实现连字符形式的复杂属性。然而,对复杂属性还可以实现内部嵌套的形式。下面的代码就是一个典型的内部潜逃形式复杂属性的应用。

<MyControl:CustomeControl id="demo1" runat="server">

<HeaderStyle ForeColor="#FFFF00" BackColor="#99ff00">

</HeaderStyle>

... ...

</MyControl: CustomeControl>

如上代码所示,自定义控件MyControl的属性HeaderStyle是一个典型的内部嵌套形式属性。实现这种形式的属性与实现连字符形式属性有很大不同,需要分为两种情况。

如果自定义服务器控件类继承自Control类,那么必须在控件类之前设置元数据属性ParseChildren和PersistChildren。示意性代码如下所示。

[ParseChildren(true),PersistChildren(false)]

public class CustomeControl:Control{ ......}

如上代码所示,在控件类前设置了两个元数据属性ParseChildren和PersistChildren。前者用于告知页面分析器把控件标记中的内容解析为属性还是子控件,该属性值设置为true,则表示解析为属性。后者用于告知设计器把控件标记中的内容保存为属性还是子控件,该属性值设置为false,表示保存为属性。

如果自定义控件类继承自WebControl类,那么就不需要以上的元数据属性设置,因为,WebControl类已经应用了这些元数据属性了。

无论自定义控件类继承自WebControl类还是Control类,为实现内部嵌套形式复杂属性,都必须在属性实现中设置如下元数据属性。

[ DesignerSerializationVisibility( DesignerSerializationVisibility.Content), NotifyParentProperty(true), PersistenceMode(PersistenceMode.InnerProperty)]

public TableItemStyle HeaderStyle{......}

由上面的代码可以看到,必须在实现复杂属性之前,应用3个元数据属性:DesignerSerializationVisibility、NotifyParentProperty和PersistenceMode。前两个元数据属性在前文中已经说明,第三个PersistenceMode用于指定如何将服务器控件属性或事件保持到ASP.NET页的元数据属性,该特性的值设置为枚举值:PersistenceMode.InnerProperty,这表示将所标识属性(HeaderStyle)保持为嵌套标记。

以上介绍了内部嵌套形式属性声明的方法。总结起来分为两种情况:一是所开发控件从Control派生,则需要设置五个设计时特性ParseChildrenAttribute(true)、PersistChildren(false)、DesignerSerializationVisibility、NotifyParentProperty和PersistenceMode。前两个特性在控件类前设置,用于告诉编译器将控件标记内的内容为属性,需要解析为属性;后三个特性在属性前指定,用于指示编译器此属性为内部嵌套形式属性,在应用控件属性时,必须采用嵌套形式。二是所开发控件从WebControl派生,这种情况比较简单,只需设置上文中后3个设计时特性即可。

3. 实现内部嵌套形式默认复杂属性

内部嵌套形式默认属性与内部嵌套形式属性非常类似,它通常用于设置某个控件的集合属性。例如,标准服务器控件中的DataList、DropDownList控件中的属性均为内部嵌套形式默认属性。

为了实现这种形式的属性,主要需设置两个元数据属性:一是在控件类前设置ParseChildren(true, "DefaultPropertyName"),指定该控件中嵌套的标记表示属性,而非子控件,同时将嵌套属性分析为该控件的集合属性;二是在集合属性前设置特性PersistenceMode(PersistenceMode.InnerDefaultProperty),表示将该属性定义为控件的默认属性。

4. 小结

本文介绍了创建复杂属性的实现方法。这是实现自定义服务器控件过程中的重点和难点内容。在随后的一篇文章中,我们将通过示例来加深对复杂属性实现方法的认识。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有