ASP.NET组件设计之复杂属性和状态管理浅析

开发 后端
ASP.NET组件设计之复杂属性和状态管理向你讲解了在ASP.NET组件设计中复杂属性和状态管理的实现以及需要注意的方面。

ASP.NET组件设计中复杂属性和状态管理的讨论:

ASP.NET组件设计之复杂属性声明/持久:

所谓复杂属性,即通常不可用CLR的基本数据类型表达的属性。譬如,FontInfo,即代表字体属性,包含Bold 、Name、Size、Color等信息(通常称为子属性)。

对于复杂属性,控件在声明时候,通常采用 属性—子属性 的连字符表示复杂属性的一个子属性。

  1. ﹤sdp:TextBox id=”Textbox1” Font-Name=”Vender” Font-Size=”12pt” runat=”server” /﹥ 

其中的划线部分即代表了Font属性。

复杂属性的另外一种表达是,将复杂属性嵌套放于控件声明标签之中,乘坐 内部属性持久性(inner property persistence )。如:

  1. ﹤asp:DataGrid runat=”Server”﹥  
  2.  
  3. ﹤HeaderStyle ForeColor=”Red” /﹥  
  4.  
  5.    ﹤/asp:DataGrid ﹥ 

复杂属性序列化/持久化的设计时支持

设计时实现是在控件之外实现的,利用元数据(attribute)来实现。对于连字符实现的子属性,经过设定特定的attribute,即可影响设计器从而实现设计时支持。

DesignerSerializationVisibility 实际上在ASP.NET中是指DesignerSerializationVisibilityAttribute的属性类,通过元数据中指定,并且设为:

DesignerSerializationVisibility.Content可以让设计器知道,应当将复杂属性的内容进行序列化而不是属性本身

DesignerSerializationVisibility.Hidden       让设计器忽略属性和属性内容

DesignerSerializationVisibility.Visible       让设计器以正常方式序列化

所谓正常方式,就是以字符传、整型如果不属于这些就用字节方式持久化属性(当然对于复杂属性这相当划不来)。

NotifyParentProperty(true) 表示属性浏览器对控件得此复杂属性的修改可以通告给控件,并告知之上的各个对象(通常会给设计器应用程序),告知属性已经“脏”了。这些约定对控件设计者和设计器开发者以及ASP.NET页面的开发者都很重要。

对于标签嵌套方式的属性持久,应当采用ParseChilren(true)来指定属性的持久,设计器实现嵌套方式则应当指定PersistChildren(false)让设计器将嵌套标签转化为复杂属性的一部分(而不是内嵌的子控件)

ASP.NET组件设计之类型转换器

为了解读复杂属性的持久形式为设计运行时形式,需要对复杂属性指定类型转换器,基本目标是将持久形式解读转换为CLR支持的类型,同时也将属性的CLR类型表达为设计时、运行时的持久形式。即将Font-Size=”8pt”转换为int32 的8,将复杂属性的8持久化为Font-Size=”8pt”.

类型转换器的实现不依赖于任何用户界面功能。因此,可在 Windows 窗体和 Web 窗体中应用同一个类型转换器。

类型转换器继承自System.ComponentModel.TypeConverter。

ASP.NET组件设计之实现类型转换器的步骤:

1、 定义一个从 System.ComponentModel.TypeConverter 派生的类。

2、 重写 CanConvertFrom 方法,指定转换器可从中转换的类型。此方法是重载方法。

3、 重写实现转换的 ConvertFrom 方法。此方法是重载方法。

4、 重写 CanConvertTo 方法,指定转换器可转换为的类型。转换为字符串类型不需要重写此方法。此方法是重载方法。

5、 重写实现转换的 ConvertTo 方法。此方法是重载方法。

6、 重写执行验证的 IsValid 方法。此方法是重载方法。

通过TypeConverter(typeof(somecustimoziedTypeConverter))的方式确定某个属性同特定的类型转换器相关。

对于ASP.NET应用来讲,如何保持两个页面间的控件的复杂属性很重要。Control类的默认状态管理交给ViewSatte字典,而复杂属性,使用ViewState时不可能的,这必须用到IstateManager接口参与状态管理。

  1.  
  2. Interface IstateManager  
  3.  
  4. {  
  5.  
  6.    public bool IsTrackingViewState ;
  7.  //当由类实现时,获取一个值,通过该值指示服务器控件是否正在跟踪其视图状态更改。   
  8.  
  9.        void LoadViewState(   object state); 
  10. //当由类实现时,加载服务器控件以前保存的控件视图状态。   
  11.  
  12. object SaveViewState(); 
  13. //当由类实现时,将服务器控件的视图状态更改保存到 Object。   
  14.  
  15. void TrackViewState();
  16. //当由类实现时,指示服务器控件跟踪其视图状态更改。  
  17.  

ASP.NET组件设计之Control,Control的ViewSatte属性实际上就是一个复杂属性,本质上是一个字典类,通过实现了IstateManager接口参与状态管理(ViewState的细节):

1、 ViewState的数据类型是复杂属性System.Web.UI.StateBag类。实现IstateManager接口的字典。保存多项键/值对,键为字符串,值为对象,当某个对象自动添加到State把实例即ViewState中去时,自动加入一个StateItem对象,存有实际的属性值和相关的布尔标志,知识此属性(StateItem)在初始化后修改过。

2、 在接口的TrackViewState中将此函数的值对应到StateBag的内部布尔变量,如果为真,则当StateItem添加时候(跟踪一个对象的ViewState),或者修改行为,都将StateItem标记为修改过。

3、 SaveViewSate中,枚举项目,创建并返回两个ArrayList分别标记修改过的键和值。

4、 LoadViewSatet执行SaveState的逆操作。

当在ViewSatte中保存属性时候,其状态会自动维护。可以在ViewState中保存任何控减灾往返传送时需要的数(而不是全部数据,从效率考虑剔除冗余数据),且任何保存在ViewState红的数据必须时通过LosFormatter串行化的

所有复杂属性的状态保存应当实现IstateManager来将复杂属性转换为可以在ViewState中保存的简单属性,并且也可以ViewState中保存的简单属性恢复组合为复杂属性。

ASP.NET组件设计之复杂属性和状态管理的相关内容就向你介绍到这里,希望对你学习ASP.NET组件设计中的复杂属性和状态管理有所帮助。

【编辑推荐】

  1. ASP.NET组件设计学习之ASP.NET服务器控件
  2. ASP.NET自定义控件入门浅析
  3. ASP.NET服务器控件视图浅析
  4. ASP.NET组件设计之生命周期详解
  5. ASP.NET组件设计之传输机制浅析
责任编辑:仲衡 来源: cnblogs
相关推荐

2009-08-05 16:53:14

ASP.NET组件设计

2009-08-10 13:32:15

ASP.NET TimASP.NET组件设计

2009-08-05 16:59:55

ASP.NET组件设计

2009-07-29 09:34:54

IsPostBack属ASP.NET

2009-08-06 18:18:27

ASP.NET控件开发ASP.NET复合控件

2009-08-10 14:38:29

ASP.NET组件设计

2009-08-10 16:07:44

ASP.NET Lin

2009-08-10 15:42:33

ASP.NET Che

2009-08-10 10:19:47

ASP.NET组件设计

2009-08-07 17:49:44

控件设计器

2009-07-22 18:03:00

ASP.NET ASP

2009-08-06 18:32:00

ASP.NET控件开发ASP.NET复合控件

2009-10-14 10:26:00

Route组件

2009-08-06 17:13:56

ASP.NET自定义控

2009-08-07 17:59:35

控件设计器

2009-08-07 16:32:52

ASP.NET控件设计时支

2009-08-05 17:39:13

ASP.NET常用状态

2009-07-31 12:43:59

ASP.NET MVC

2009-08-05 15:50:13

ASP.NET优点

2009-07-24 13:41:15

ASP.NET AJA
点赞
收藏

51CTO技术栈公众号