本篇来解释上篇博文中用户输入数据没有消失的问题。(由于http协议的无状态性使得每次页面请求都会重新创建所有控件。即所有的数据都将不复存在)
先来看一下asp.net页面的生命周期
ASP.NET页面的生命周期:(详见ASP.Net4.0权威指南第1章第3节)
1.浏览器提出请求
2.页面框架初始化
此阶段开始创建ASP.net页面,产生你在.aspx页面里面用标签定义的所有控件,此外,如果页面不是第一次被请求,即只是一次会是回送,ASP.net将反序列化状态视图信息并把它们应用到所有的控件上,page_Init事件在这个阶段被触发。
Page_Init在所有外观设置后引发,使用该事件来读取或初始化控件属性。
3.用户代码初始化
4.验证
5.事件处理
6.呈现
7.清除
再看每次请求页面时发生的事情:
![](https://i-blog.csdnimg.cn/blog_migrate/f22fd10d368d9d369200c21d93207518.jpeg)
由于http协议的无状态性使得每次页面请求都会重新创建所有控件。即所有的数据都将不复存在,那我们那什么来交互呢?
ASP.NET 2.0提供了视图状态(ViewState)这一项非常重要的技术,它能使得页面和页面中的控件在从服务器到客户端,再从客户端返回的往返过程中保持状态信息。这样就可以在Web这种无状态的环境之上创建一个有状态并持续执行的页面效果。
视图状态的具体运行过程为:每当用户请求某个.aspx页面时,.NET框架首先把相关控件的状态数据序列化成一个字符串,然后,将其做为名为__VIEWSTATE的隐藏域的Value值发送到客户端。如果页面是第一次被请求,那么服务器控件也将是被第一次执行时,名为__VIEWSTATE的隐藏域中只包含控件的默认信息,通常为空或者null。在随后的回送事件中,ViewState中就保存了服务器控件在前面回送中可用的属性状态。这样服务器控件就可以监视在当前被处理的回送事件发生之前的状态了。这些过程是由.NET框架负责的,对用户来说是执行.aspx页面就有了持续执行的效果。(使用视图状态时,对象必须先序列化,然后再通过回传进行反序列化。)
所以上篇博文里的数据为何存在就得以解释了。