快速业务通道

探讨ASP.NET 2.0中的Web控件改进技术

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-21
为你最坏的敌 人—这要依赖于你使用它的方式来决定。如果你在以前曾经使用过ViewState, 那么,你肯定会喜欢新的ControlState。

关于ViewState的最令人头痛的问题之一就是,它的“all-or-nothing”状态 管理方法。页面开发者可以很容易地决定在任何控件级,页面级或在整个站点级 (经由web.config)上关闭ViewState。事实上,如果你在整个站点级上通过 web.config关闭ViewState的话,那么,你不妨猜测一下你还能够在其它什么地 方关闭它?答案是:还可以在machine.config中实现—在此情况下,它能够影响 到同一服务器上的所有站点。如果一个页面开发者决定关掉在ViewState中实现 状态管理的能力,那么,你的控件生成有可能出现部分不可用,或更有甚者—完 全不可用。

为此,在新版本中,微软创建了ControlState—旨在解决这一问题。页面开 发者不能关掉ControlState,因此使用它进行属性选择更为安全。

使用ControlState与使用ViewState几乎完全一致。然而,ControlState并没 有提供象ViewState这样的一个变量,而是提供了称为SaveControlState和 LoadControlState的方法以便于你的控件能够进行重载。这些方法与 SaveViewState和LoadViewState方法的工作原理完全一致。

因为ControlState在属性语句中没有提供一个相应的变量,所以,你必须借 助于ASP.NET开发者以前在他们的对象中所使用的成员变量(属性语句)来实现相 同的功能。

Protected _MailServer As String = "First name:"
Public Property MailServer() As String
Get
Return _ MailServer
End Get
Set(ByVal value As String)
_MailServer = value
End Set
End Property

然而,因为我使用了一个标准的成员变量来保存值,所以我需要一种方法以 便把数据存储在ControlState中—这正是前面提到的方法“登场”的原因。就象 在它们相应的ViewState方法中那样,ASP.NET将在页面生命周期内调用这两个方 法。其中,SaveViewState方法返回一个将被持久存储的对象类型。通过返回一 个对象数组,这个方法可以存储多个值。并且,就象发生在SaveViewState方法 中一样,也是使用数组的0下标元素来调用基类的SaveControlState方法。

Protected Overrides Function SaveControlState() As Object
Dim state() As Object = New Object(2) {}
state(0) = MyBase.SaveControlState()
state(1) = _MailServer
Return state
End Function

注意:LoadControlState方法以一个对象作为参数—这个对象是以前在 SaveControlState中返回的一个对象。在这个方法中,我重新分配了成员变量— 通过把该参数转换为一个对象数组,然后获得每个下标的值。与以前一样,我使 用数组的0下标来调用基类的LoadControlState方法。

Protected Overrides Sub LoadControlState( _
ByVal savedState As Object)
If savedState IsNot Nothing Then
Dim state() As Object = CType(savedState, Object())
MyBase.LoadControlState(state(0))
_MailServer = CType(state(1), String)
End If
End Sub

借助于这些方法来存储数据,在页面开发者关掉ViewState时,控件就不会出 现前面那些麻烦。

你可能对ControlState的存储位置感到惊讶;它对应于另一个生成到HTML页面 中的隐藏的文本框。就象在ViewState情况下数据被存储在__ViewState隐藏文本 框中类似,ASP.NET 2.0使用__ControlState隐藏文本框来存储ControlState数 据。

遗憾的是,微软没有向开发者提供内在地使用ControlState的能力—就象在 ViewState情况下那样。所以,为了ControlState使用,你需要注册你的控件。 你可以重载控件的OnInit事件并且调用Page对象的 RegisterRequiresControl

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号