我的观点是:ViewState有可能成为你最好的朋友,也有可能成为你最坏的敌人—这要依赖于你使用它的方式来决定。如果你在以前曾经使用过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对象的 RegisterRequiresControlState方法。
以下是引用片段:
  Protected Overrides Sub OnInit(ByVal e As System.EventArgs)
  MyBase.OnInit(e)
  If Page IsNot Nothing Then
  Page.RegisterRequiresControlState(Me)
  End If
  End Sub
现在,你可以使用ControlState来存储你认为足够重要的数据—如果不把它存储起来,那么你的控件可能生成一些无用的内容。
记住,你在设计时刻对属性的修改将被硬编码到该控件的ASPX声明中,从而在相邻的再次回寄之间自动地存储。然而,如果表单上的一个行为改变了 一个控件的属性,那么,这将会激活状态管理机制的使用。如果不把该属性存储在一个状态中,那么,在下一次回寄时它将恢复到“硬编码”状态。
现在,总的来看,我们应该把与外观相关的属性存储在ViewState中,而把与行为相关的属性存储在ControlState中。通过这种方式,如果一个页面开发者关掉ViewState,那么你的控件尽管可能看起来样子别扭,但是仍能正确工作。

探讨ASP.NET 2.0中的Web控件改进技术(2)相关推荐

  1. 探讨ASP.NET 2.0中的Web控件改进技术(3)

    当你最开始在Visual Studio 2005中使用Windows表单控件或是ASP.NET Web控件时,你首先会注意到,在许多控件右上角出现一个箭头形状的小玩意儿(见图2中的示例).点击这个箭头 ...

  2. 探讨ASP.NET2.0中的Web控件改进技术

    全面探讨ASP.NET 2.0中的Web控件改进技术之概述(一) ASP.NET 2.0并没有抛弃1.1版本中的任何现有控件,而是增加了一组新的控件;同时还引入了若干新的控件开发技术.本系列文章将对这 ...

  3. 使用ASP.NET 2.0中的GridView控件

    在ASP.NET 2.0中,加入了许多新的功能和控件,相比asp.net 1.0/1.1,在各方面都有了很大的提高.其中,在数据控件方面,增加了不少控件,其中的gridview控件功能十分强大.在本文 ...

  4. Ajax 1.0 中使用web控件调用后台方法的用法.

    今天在做页面文本框审核的时候发现个Ajax 1.0 中使用web控件调用后台方法的一个不爽的地方. 把该调用方法发上来供大家参考. 首先我们创建一个MasterPage.master文件. 在页面上放 ...

  5. ASP.NET 2.0中使用Gridview控件的高级技巧

    ASP.NET 2.0中,新增加的gridview控件的确十分强大,弥补了在asp.net 1.1中,使用datagrid控件时的不足之处.因为在asp.net 1.1中,在使用datagrid时,很 ...

  6. [转]利用ASP.NET 2.0创建自定义Web控件(1)

    原址:http://hi.baidu.com/sjbh/blog/item/cc58fd1bd35d3ad2ad6e7593.html   简介 从使用基本的文本编辑器到创作标记页面,Web 开发已经 ...

  7. 探讨ASP.NET2.0的Web控件改进之概述

    作者: 朱先忠编译 一. 引言 到目前为止,你可能已经了解了大量的ASP.NET 2.0新特征-母版页面,主题,提供者,等等--所有这样内容都相当精彩:但是,你是否了解到有关定制Web控件开发方面的重 ...

  8. ASP.NET 3.5中的ListView控件和DataPager控件(一)

    介绍 今天,我花了几个小时的时间研究了一下ASP.NET 3.5中的ListView控件和DataPager控件. 这两个控件是ASP.NET中新增的.非常受欢迎的控件. ListView控件集成了D ...

  9. 【转贴】ASP.NET 3.5中的ListView控件和DataPager控件

    作者:Rick Strahl  翻译:webabcd 原文地址:http://www.west-wind.com/WebLog/posts/127340.aspx 译文地址:http://www.cn ...

最新文章

  1. 解读:spring-boot logging。记一次Logback在spring-boot中的使用方法
  2. 你不一定真正理解的NAT术语
  3. set在python中什么意思_python中set是什么意思
  4. 配置oracle 11g环境,oracle 11g 的安装环境的配置
  5. 计算机地图制图知识点,地图制图知识点整理
  6. linux多核单进程,Linux的在多核处理器3个处理(每个进程在不同的核心上运行)之间共享存储器/ SMP...
  7. SAP Spartacus B2B Org Unit树状结构的加载机制
  8. HTTP调试之保持连接状态(微软知识库文章)
  9. 【Java】JDK8新特性之方法引用
  10. 微信php 客户端cookie,微信内置浏览器中的cookie很诡异呀
  11. mysql firstday_MySQL 计算本月的第一个和最后一个周一
  12. myeclipse激活+Aptana安装配置
  13. pythonturtle是标准库_Python常用标准库1-Turtle,Random,Time和Datetime
  14. LabVIEW FPGA PCIe开发宝典-实战篇:实验63:PCIe DMA+16位8通道ADC(模拟数据采集卡)
  15. cmder 下载及安装
  16. nvidia driver 驱动重装教程
  17. FPGA之JESD204B接口——总体概要 尾片
  18. 网页设计HTML遇到的问题,网页制作常遇到的问题集合
  19. Qt的gui编程是,点击一次button出现两次action
  20. Unity 调用系统自带的虚拟键盘

热门文章

  1. Java并发编程,3分分钟深入分析volatile的实现原理
  2. js中浮点型运算 加减乘除
  3. redis存储的数据类型
  4. rotate array 旋转数组
  5. Delphi Math里的基本函数,以及浮点数比较函数(转)
  6. js代码赋值触发select控件的onchange事件
  7. ini_set(display_errors,On);和error_reporting(E_ALL);
  8. Wargame.kr_Web:already got
  9. (六)Vue3.0预学习
  10. Duplicate keys detected: '0'. This may cause an update error.