ASP.NET ViewState简要分析
写于2013年3月21日 星期四 夜
第一次知道ViewState这个名词,是从学校毕业两年以后。在学校做的项目都是只关注实现效果,不关心实现原理。可是,随着学习的深入,很多人都有相同的感受,就是越发学习,越发感觉自己什么都不会。个人感觉,这实际上是学习的一个过渡期。当然处于这个阶段的人,必须能禁得起孤独和煎熬,那么成功便也指日可待了。
下面切入正题,viewState是asp.net中状态保持方案的一种,并且是客户端的状态保持方案。
说到这里,我们先来看下:客户端状态保持方案和服务器端状态保持方案主要有哪几种?
客户端状态保持方案:
01. viewState
02. HiddenField
03. Cookies
04. ControlState
05. Querystring
客户端状态保持方案本质上有3种:隐藏域/Cookies/QueryString
服务器端状态保持方案:
01. Session
02. Application Object
03. Caching
04. Database
今天咱们主要探讨viewState
Viewstate:Asp.NET的.aspx页面特有的,属于页面级的对象。也就是说 只能在本页面上使用viewState。就是在页面上的一个隐藏域中保存客户端单独使用的数据的一种方式;在ASP.NET中,非单值服务器端控件的值都自动保存在ViewState中。说白了,viewstate我们再页面中式无法看到的,隐藏域就是viewstate用来保存视图状态的容器。
由于文本框是单值控件(只能存储单个值),所以不会保存到viewState中,文本框的值仍然能保留使用的其他状态保持方式。那么哪些控件的状态不在viewState中保存呢?其实我们可以用一句话来总结,就是单值表单元素的值不使用ViewState保存状态。例如文本框,原因是文本框的值在有了name属性后可以被post到服务器上,所以没有必要使用viewState来保存状态。我们日常看到的控件 ,比如:GridView的状态保持就是通过viewState来完成的。简单来说,当页面回发时,GridView中数据依然存在的原因,就是由于GridView默认开启了viewState,而viewState中记录了GridView的控件名称等信息,服务器端经过一系列处理后,根据记录的GridView控件名称等信息将数据还原到GridView中,并且在页面的隐藏域中也做了相同的记录。当客户端通过post方式向服务器发送请求时,会携带着viewState,服务器在接收到用户请求的页面后,会自动在请求体中查找是否包含名称为_viewState的隐藏域,如果有,则将中间的值解码后添加到页面的viewState属性中。
使用viewState前提:
使用viewState的前提是页面上必须有一个服务器端标记
<form runat=”server” >否则,viewState就无从谈起。
Viewstate适用于同一个页面在不关闭的情况下多次与服务器交互。
ViewState相关事件概述
说起这个,咱们就要从页面的生命周期谈起。
页面生命周期(页面生命周期的一部分):
1, 创建页面类对象
2, 调用页面类的processrequest方法
3, LoadAllState():加载视图状态
4, Load
5, SaveAllState():保存视图状态
6, Render()方法,显示控件
看了这么多的文字,是否有点枯燥,下面我们来看一张图。
图解viewState
文章的最后,我们来看下如何禁用viewState
ViewState禁用方法:
1, 禁用单个ViewState设定EnableViewState=false,禁用ViewState后TextBox不受影响,因为input的value不依靠viewState
2, 禁用整个页面的viewState,在aspx的Page指令区域加上EnableViewState=”false”。
3, 当某些控件的某些属性不属于浏览器表单的提交范围时,.NET FrameWork会把这些属性添加到ViewState中保存。
4, WebForm的IsPostBack就是依赖于_viewState实现的。
好了,今天对ViewState的探讨就到这里。也希望大鸟对我的文章知识点提出宝贵意见。毕竟能力有限,欢迎交流。