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

在上一篇文章中,曾经提及“复杂属性”的概念。复杂属性的最大特征是属性的类型是本身具有属性(称为子属性)的类。通常情况下,复杂属性表现为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. 小结

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

(0)

相关推荐

  • ASP.NET2.0服务器控件之自定义状态管理

    在前面的系列文章中,我们曾经介绍了视图状态和控件状态的基本概念和典型应用,从中可以发现,视图状态和控件状态对于自定义服务器控件实现的重要性.本文将继续这一主题,重点介绍实现视图状态和控件状态自定义管理的方法. 自定义视图状态管理 在介绍视图状态时,我们曾经提到过:对于简单属性,例如,String.Int等类型,.NET执行引擎将自动启用默认视图状态管理机制,以便完成相应的功能.然而,如果开发人员在ViewState中保存的是自定义数据类型,或者需要实现自定义方式优化视图状态管理时,则必须实现自定

  • ASP.NET2.0服务器控件之类型转换器

    类型转换器是实现自定义服务器控件属性过程中比较重要的内容.本文将对类型转换器的基本概念和实现方法进行介绍. 1. 类型转换器基本概念 类型转换器是自定义服务器控件的辅助性功能实现.它主要用于执行从字符串表示形式到指定类型之间的双向转换.例如,以文本形式表示属性值,将用户输入的文本转换为相应数据类型等等,都应用了类型转换器. 对于多数基本数据类型(如Int32.Bool.Char.String.枚举类型等),.net框架已经为它们提供了默认的类型转换器,这些类型转换器完成从字符串到相关值的转换并执

  • ASP.NET自定义Web服务器控件之Button控件

    本文实例讲述了ASP.NET自定义Web服务器控件之Button控件实现方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: using System;  using System.Collections.Generic;  using System.ComponentModel;  using System.Linq;  using System.Text;  using System.Web;  using System.Web.UI;  using System.Web.U

  • asp.net Textbox服务器控件

    复制代码 代码如下: <body>    <form id="form1" runat="server">    <div> 姓名:<asp:TextBox ID="txtUser" runat="server"></asp:TextBox>        <br />        <br />        性别:<asp:Radio

  • ASP.NET服务器控件的生命周期分析

    本文实例分析了ASP.NET服务器控件的生命周期.分享给大家供大家参考.具体如下: (1)初始化----在此阶段中,主要完成两项工作:一.初始化在传入Web请求生命周期内所需的设置:二.跟踪视图状态.首先,页面框架通过默认方式引发Init事件,并调用OnInit()方法,控件开发人员可以重写该方法为控件提供初始化逻辑.此后,页面框架将调用TrackViewState方法来跟踪视图状态.需要注意的是:多数情况下,Control基类提供的TrackViewState方法实现已经足够了.只有在控件定义

  • ASP.NET入门之HTML服务器控件概述

    ASP.NET 中的HTML服务器控件是服务器可理解的HTML标签. ASP.NET 文件中的 HTML 元素默认作为文本进行处理.为了使这些元素可编程化,需要向 HTML 元素添加 runat="server" 属性.该属性指示该元素应作为服务器控件进行处理. 注意: 1.所有 HTML 服务器控件必须位于带有 runat="server" 属性的标签内! 2.ASP.NET 要求所有 HTML 元素必须正确关闭和嵌套. HTML服务器空间及相关描述如下表所示:

  • ASP.NET2.0服务器控件之Render方法

    控件呈现是指向HTTP输出流中写入标记文本的过程.服务器通过HTTP输出流向客户端发送生成的标记文本,这些文本将会通过客户端浏览器转换为可视化的元素显示出来.使用控件呈现,开发人员可以将HTML标记.脚本代码.CSS样式表等等输入到客户端浏览器.实现服务器控件呈现主要有两种方式:一是Control类的Render方法,二是WebControl的RenderContents方法.本文重点介绍使用Control类的Render方法实现控件呈现的应用. 使用HtmlTextWriter类 Contro

  • jQuery生成asp.net服务器控件的代码

    HTML如下 复制代码 代码如下: <tr> <td class="leftTd" style="width: 107px">附加金额</td> <td style="width: 315px"><asp:TextBox ID="txtExtendMoney" Text="0" runat="server"></asp:T

  • ASP.NET 动态写入服务器端控件第1/2页

    关于动态写入html标签控件,大家都熟悉,这里就不再表述.本文讨论的重点是:如何动态写入服务器端控件,并且在页面PostBack到Server端时,在Server端来获取被动态写入的服务器端控件的各种属性. 这里,我来通过一个Demo来说明这个应用. 需求: 1. 用户在UI上输入一个数值(比如:5),系统动态为用户加载这个数值的Url Address输入域; 2. 用户输入的Url Address内容需要通过Url格式验证; 3. 用户提交输入内容后,系统给出提交的结果 设计如下: 1. Cs

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

    在上一篇文章中,曾经提及"复杂属性"的概念.复杂属性的最大特征是属性的类型是本身具有属性(称为子属性)的类.通常情况下,复杂属性表现为3种形式:连字符形式属性.内部嵌套形式属性和内部嵌套形式默认属性.本文将介绍以上3种形式复杂属性的具体实现方法. 1. 实现连字符形式复杂属性 连字符形式属性是比较常见的复杂属性.我们常用的Font属性就是一个复杂属性,其包括多个子属性,如Bold.Name等.这种类型属性具有两种语法格式:一种是利用连字符语法,在控件的开始标记中保存子属性,例如,Fon

  • ASP.NET 4.0配置文件中的ClientIDMode属性详解

    时光流逝,我们心爱的ASP.NET也步入了4.0的时代,微软在ASP.NET 4.0中对很多特性做了修改.比如我将要讨论的控件ID机制就是其中之一. 在ASP.NET 4.0之前我们总是要为控件的ClientID头疼,比如明明一个叫lblName的Label放在一个叫做grd的GridView里面后,在页面上改Label的ID就变成了诸如grd_clt02_lblName的一长串字符串,如果我们在前台想在使用JS的时候找到该Label,我们不得不用到C#脚本来获得该Label在前台的确切ID,诸

  • ASP.NET服务器控件开发(1)封装html

    在我们的项目开发中,由于ASP.NET的服务器控件功能有限,所以我们经常会自己定义特定的服务器控件,来满足开发中特定的业务要求.可见知道如何开发ASP.NET服务器控件是非常有必要的. 其实简单的实现ASP.NET服务器控件不是很难,以前园子中也有大牛介绍过相应的内容,这里站在巨人的肩膀上也来分享下开发ASP.NET服务器控件的方法和自己的一些体会.写给新手,高手绕过. 学习ASP.NET的服务器控件开发,个人认为最好的方式就是自己去实践,当然理论知识也是很重要的,但是如果我们只是看理论的知识,

  • 使用ASP.NET 2.0 CSS 控件适配器生成CSS友好的HTML输出

    [原文地址] Tip/Trick: Use the ASP.NET 2.0 CSS Control Adapters for CSS friendly HTML output [原文发表日期] Wednesday, November 29, 2006 11:01 PM 厌烦了内置的ASP.NET服务器端控件生成 HTML <table> 元素,而希望你能使用纯粹的CSS方案?如果是这样,读下去... 上个星期,我们发布了ASP.NET 2.0 CSS 控件适配器的1.0正式版.这些适配器利用了

  • ASP.NET 2.0中的页面输出缓存

    静态页面全部内容保存在服务器内存中.当再有请求时,系统将缓存中的相关数据直接输出,直到缓存数据过期.这个过程中,缓存不需要再次经过页面处理生命周期.这样可以缩短请求响应时间,提高应用程序性能.很显然,页面输出缓存适用于不需要频繁更新数据,而占用大量时间和资源才能编译生成的页面.对于那些数据经常更新的页面,则不适用.默认情况下,ASP.NET 2.0启用了页面输出缓存功能,但并不缓存任何响应的输出.开发人员必须通过设置,使得某些页面的响应成为缓存的一部分. 设置页面输出缓存可以使用以下两种方式:一

  • 在ASP.NET 2.0中操作数据之四:使用ObjectDataSource展现数据

    在完成了应用程序架构和页面的设计后,我们可以开始探讨如何实现多种多样的普通数据到报表展现的任务.前面我们已经了解到如何在从数据访问层和业务逻辑层绑定数据到ASP.NET页面上的数据控件.在ASP.NET 1.x应用程序中,通过对数据控件的DataSource属性赋值然后调用控件的DataBind()方法从而实现数据展现的方式在ASP.NET 2.0应用程序中可以继续使用.然而,ASP.NET 2.0的数据源控件提供了一种新的方式,使用这些控件可以让你轻松从上文中创建的业务逻辑层中进行数据绑定,甚

  • Asp.Net MVC3.0如何项目部署到Win7 64位系统

    之前一直是通过Visual Studio直接F5来运行自己编写的项目或者小程序,很少通过部署发布到IIS上面,于是自己便在自己的笔记本上进行测试,结果还真是发现了不少问题,于是自己重新通过虚机程序进行全裸的新一次部署实践. 部署进程 第一步:现在Win7 64位操作系统上安装IIS,通过控制面板位置即可开启安装.如下图所示: 勾选后点击确定进行安装即可. 第二步:IIS安装成功后,因为我的程序是通过VS2010开发的,而且是Asp.Net MVC3.0的程序,而且我的Win7 64位虚机也是新安

  • ASP.NET 2.0/3.5中直接操作Gridview控件插入新记录

    一.简介 从ASP.NET 2.0起引入了一批新的功能强大的视图控件,例如Gridview.FormView和DetailsView等等.通过和数据源控件的简单结合,在许多情况下,仅需要简单的配置方式就可以开发出功能强大的应用程序.但遗憾的是,Gridview控件中并没有提供像在FormView和DetailsView控件中那样直接插入新记录操作的支持.图1给出了典型的使用控件展示数据库数据的情形. 图1 使用GridView控件展示VS2005示例数据库Address表格中的数据熟悉Gridv

随机推荐