深入理解 ViewState

2016-02-19 20:13 5 1 收藏

图老师小编精心整理的深入理解 ViewState希望大家喜欢,觉得好的亲们记得收藏起来哦!您的支持就是小编更新的动力~

【 tulaoshi.com - Web开发 】

  上个星期写了一篇《控件 ViewState 属性的值保存去哪里了》,解释了Control.ViewState最终还是通过Control.SaveViewState和Control.LoadViewState这两个方法存取的。文章中有一句话可能会让大家感到疑惑的:“我们在OnInit之后使用this.ViewState[key]读写时该属性都为true”,其中“该属性”指StateItem.IsDirty。到底为什么IsDirty属性在OnInit之后总是为true呢?参考了TRULY Understanding ViewState,我终于明白到其实它并非总是为true,详细原因请听我慢慢说。

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/webkaifa/)

  首先要让大家来看的是StateBag.TrackViewState方法,这个方法在控件OnInit时就会被调用,而它的作用就是让StateBag开始跟踪StateItem的变化,任何变化都将导致该StateItem的IsDirty属性变为true。也就是说,在OnInit之前,IsDirty属性是false的,并且无论你如何设置Value属性的值都不会改变IsDirty属性。在OnInit之后,IsDirty属性也保持着false,直到你第一次改变Value属性的值(指通过this.ViewState[key]的方法改变)。到了SaveViewState的阶段,只有IsDirty属性为true的StateItem才会被保存下来。

  为什么要如此设计呢?例如一个通过声明性定义的Label的Text属性,在ASPX中它被赋了初值,然后该初值自然通过ViewState["Text"]来持久。在下一个页面生命周期,首先OnInit时这个Label的Text属性会加载ASPX中声明性定义的初值,然后LoadViewState时会用ViewState中读取到的ViewState["Text"]来覆盖它。然而除非你在上一个页面生命周期以编程的方式改变了Text属性,否则ViewState["Text"]还是初值,那么你就是用ViewState["Text"]保存初值去覆盖声明性定义的初值,同一个值这样覆盖完全没意义,而且还浪费了ViewState的空间。为了解决这个资源浪费的问题,凡是声明性定义之后没改变到的值就不应该使用ViewState来持久,而详细的实现就是上面说的TrackViewState机制了。

  说到这里,Control.ViewState已经解释完毕,如果你是控件设计者你可以放心地按以下方式把控件属性存放到ViewState中:
  public string Text
  {
    get {return this.ViewState["Text"] as string;}
    set {this.ViewState["Text"] = value;}
  }
  它的内部机制会懂得区分你存进去的值是不是ASPX上声明性定义的初值,然后决定是否持久该值。同时,如果你在任何阶段想改变一个ViewState值是否持久的决定,可以通过ViewState.SetItemDirty(key, dirty)来改变,这基本上已经满足了所有控件开发人员的需求。

  http://www.cnblogs.com/cathsfz/archive/2006/10/29/543695.html

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/webkaifa/)

来源:https://www.tulaoshi.com/n/20160219/1623052.html

延伸阅读
abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进行抽象类定义时对于abstract class和interface的选择显得比较随意。其实,两者...
★ 编程思路 : java.security包中的MessageDigest类提供了计算消息摘要的方法, 首先生成对象,执行其update( )方法可以将原始数据传递给该对象,然后执行其digest( )方法即可得到消息摘要。具体步骤如下: (1)生成MessageDigest对象 MessageDigest m=MessageDigest.getInstance("MD5"); 分析:和2.2.1小节的KeyGenerator类一...
标签: Web开发
用户的交互操作(interaction)驱动着Web站点。理解如何处理响应信息,特别是在使用新的交互操作形式(例如AJAX)的时候,这一点非常重要的。Kris Hadloc解释了AJAX请求-响应过程的本质,你应该了解这些内容,更好地为用户交互操作服务。   请求和响应 AJAX引擎分很多个方面,每个方面都很重要。如果引擎执行发送请求和接收...
标签: Web开发
在使用CSS实现表现的时候,会经常接触到display:inline-block这一属性,无论是初接触Web标准还是接触标准已久的朋友,大都会对这一属性感觉很迷惑和模糊。 display:inline-block 将对象呈递为内联对象,但是对象的内容作为块对象呈递。旁边的内联对象会被呈递在同一行内,允许空格。 但对于这个属性不是所有浏览器都识别。 ...
标签: windows 操作系统
  系统的启动分三个步骤。第一个步骤从接通电源开始,系统BIOS对硬件设备进行例行的加电自检,即所谓的POST(Power On Self Test)检查,包括RAM检查、软硬驱和CD-ROM驱动器检测等。接着,BIOS读取活动分区主引导记录MBR(Master Boot Record)的启动装载器。最后,当启动装载器初始化完成之后,操作系统启动过程正式开始。启动操作...

经验教程

330

收藏

75

精华推荐

Java线程中断的本质深入理解

Java线程中断的本质深入理解

976385047

深入理解final变量的初始化

深入理解final变量的初始化

銏蜍叆祢啲纪鳦

深入理解void以及void指针的含义

深入理解void以及void指针的含义

rbip9mndk3yvf

微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部