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

首先要让大家来看的是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)来改变,这基本上已经满足了所有控件开发人员的需求。

转载于:https://www.cnblogs.com/cathsfz/archive/2006/10/29/543695.html

深入理解 ViewState相关推荐

  1. 【转】真正理解ViewState

    [转]真正理解ASP.NET的ViewState (Truly Understanding ViewState) 作者:Infinities Loop 概述 ViewState是一个被误解很深的动物了 ...

  2. 真正理解ViewState(TRULY Understanding ViewState)

    引用地址(en):http://weblogs.asp.net/infinitiesloop/archive/2006/08/03/Truly-Understanding-Viewstate.aspx ...

  3. asp.net ViewState详解

    ViewState是一个被误解很深的动物了.我希望通过此文章来澄清人们对ViewState的一些错误认识.为了达到这个目的,我决定从头到尾详细的描述一下整个ViewState的工作机制,其中我会同时用 ...

  4. 【转】ASP.NET ViewState详解

    (wyt今天学习了这篇文章,作为门外汉的我了解了很多页面控件数据加载的知识和viewstate的用法和原理.我想在日后的开发效率提升上会有很大的作用.) 转自http://www.cnblogs.co ...

  5. 【荐】【转】ASP.NET ViewState详解

    作者:Infinities Loop 概述 ViewState是一个被误解很深的动物了.我希望通过此文章来澄清人们对ViewState的一些错误认识.为了达到这个目的,我决定从头到尾详细的描述一下整个 ...

  6. 【转载】viewState详解

    作者:Infinities Loop 概述 ViewState是一个被误解很深的动物了.我希望通过此文章来澄清人们对 ViewState的一些错误认识.为了达到这个目的,我决定从头到尾详细的描述一下整 ...

  7. 通过HTTP抓包,深入理解ASP.NET WebForm ViewState

    为什么80%的码农都做不了架构师?>>>    上周完成了一个从ASP.NET WebForm 开发的站点抓包的功能.该功能要求使用该网点内的帐号通过我们自己的程序获取网站内的数据. ...

  8. HTTP协议是无状态协议,怎么理解?

    2019独角兽企业重金招聘Python工程师标准>>> Http是一个无状态协议,同一个会话的连续两个请求互相不了解,他们由最新实例化的环境进行解析,除了应用本身可能已经存储在全局对 ...

  9. 七天学会ASP.NET MVC (一)——深入理解ASP.NET MVC

    七天学会ASP.NET MVC (一)--深入理解ASP.NET MVC 系列文章 七天学会ASP.NET MVC (一)--深入理解ASP.NET MVC 七天学会ASP.NET MVC (二)-- ...

最新文章

  1. 只改一个值!马上加快宽带上网速度
  2. 人工智能:技术本无罪,善恶在人心
  3. HTTP学习笔记(1)
  4. python 重载id函数_Python函数重载实例
  5. ASP.NET MVC+JQueryEasyUI1.4+ADO.NET Demo
  6. swift 闭包的使用
  7. 2007年IT技术走向何方 网络将再掀“酷”革命
  8. Linux Irq domain
  9. python表白程序-python告白程序
  10. ImageJ -介绍与安装
  11. 数据的力量 |《2021—2022中国大数据行业发展报告》发布
  12. IO流文件指针(移动和获取文件读指针)
  13. 计算机公式sin,三角函数换算(新版中文三角函数计算器)
  14. 关于/etc/hosts文件
  15. 网页中打开某个网页自动弹出扣扣群实现方法
  16. pyspider 文档介绍
  17. 4G,64bit,PAE
  18. keystore was tampered with,or password was incorrect解决办法
  19. 不提杨元庆,先看看联想该如何让Moto复活
  20. 轻量化网络结构——MobileNet

热门文章

  1. 为什么戏说php,PHP语言之戏说PHP框架的味道
  2. php版canvas,PHP实现将HTML5中Canvas图像保存到服务器
  3. 单一IP地址静态NAT实验环境
  4. c语言学籍管理实验报告,c语言实验报告(学生学籍管理系统)
  5. 如何让Toast响应点击事件等基础Android基础文章N篇
  6. 在Visual C#中用ListView显示数据记录
  7. matlab求解集合覆盖问题,Set Cover Problem (集合覆盖问题)
  8. java 后台 小程序微信支付
  9. Hive数据倾斜及处理
  10. Hive DDL DML