2.为新建的对象加载旧对象的状态。
只有这样我们才可以得到我们想要的数据C。我们来进一步看看内部机制。在每个请求结束时(简单的就可以认为在服务器把数据发送给我们之前,此时数据还在服务器),就会引发一些事件,调用一些方法:
·页面自动调用Controls集合中控件的SaveViewState方法,也就是迭代页面中所有控件,调用他们的SaveViewState方法,因为控件都是Control的子类,而Control类中有这个方法。
·每个控件的SaveViewState方法把控件的状态存储到一个对象中。
·页面获取每个控件的返回的那个保存状态的对象,然后用与对象有关的转换器把保存的状态的对象转换为字符串,然后把这些字符串表达式组合起来保存在一个隐藏字段中,隐藏字段名为:_VIEWSTATE.如下:
<input type=”hidden” name=”__VIEWSTATE” id=”__VIEWSTATE” value=”/wEPDwULLTE3MDU5MjY
4MTkPZBYCAgMPZBYCAgEPFCsAAmRkFgZmD2QWAmYPDxYCHgRUZXh0BQ5QYXltZW50IE1ldGhvZGRkAgEPZB
YCZg8PDxYCHgtfIURhdGFCb3VuZGdkZGQCBw9kFgRmDw8PFgIfAWdkZGQCAg8PDxYCHwFnZGRkZJDAqbyjC
j4rjagRWSiVYTp7nQfM” />
4MTkPZBYCAgMPZBYCAgEPFCsAAmRkFgZmD2QWAmYPDxYCHgRUZXh0BQ5QYXltZW50IE1ldGhvZGRkAgEPZB
YCZg8PDxYCHgtfIURhdGFCb3VuZGdkZGQCBw9kFgRmDw8PFgIfAWdkZGQCAg8PDxYCHwFnZGRkZJDAqbyjC
j4rjagRWSiVYTp7nQfM” />
·然后_VIEWSTATE隐藏字段就发送到了客户端,和页面数据一起。
·当页面回传到服务器,就发生下面的操作:
页面字符串从_VIEWSTATE中得到字符串表达式。
页面矿建解析字符串表达式
页面框架使用与对象相关的类型转换器,根据字符串表达式重新创建状态对象。
页面框架调用Controls集合中每个对象的LoadViewState方法加载之前的状态
然后进行其他的处理。
就这样,ASP.NET就在请求之间保存了状态。
总结:大家可以这么认为:服务器端把页面中对象的状态序列化到客户端,然后下面再反序列化得到之前的状态。