在页面生命周期执行时 Page 对象在 SaveState 阶段都发生了什么事?
先看下 SaveViewState 的源码:
// Answer any state this control or its descendants want to save on freeze.
// The format for saving is Triplet(myState, ArrayList childIDs, ArrayList childStates),
// where myState or childStates and childIDs may be null.
internal object SaveViewStateRecursive() {
if (flags[disableViewState])
return null; object adapterState = null;
if (_adapter != null) {
adapterState = _adapter.SaveAdapterViewState();
} object controlSavedState = SaveViewState(); ArrayList childStates = null;
if (HasControls()) {
ControlCollection occasionalFieldControls = _occasionalFields.Controls;
int occasionalFieldControlCount = occasionalFieldControls.Count; bool useId = LoadViewStateByID;
for (int i = ; i < occasionalFieldControlCount; i++) {
Control child = occasionalFieldControls[i];
object childState = child.SaveViewStateRecursive();
if (childState != null) {
if (childStates == null) {
childStates = new ArrayList(occasionalFieldControlCount);
} if (useId) {
child.EnsureID();
childStates.Add(child.ID);
}
else {
childStates.Add(i);
}
childStates.Add(childState);
}
}
} if (_adapter != null) {
if ((controlSavedState != null) || (adapterState != null) || (childStates != null)) {
return new Triplet(controlSavedState, adapterState, childStates);
}
}
else {
if ((controlSavedState != null) || (childStates != null)) {
return new Pair(controlSavedState, childStates);
}
} return null;
}
SaveViewState
从上面的源码可以看出当页面运行至 SaveState 阶段时,将调用其自身 SaveAllState() 方法,在这个方法内部,做了两件事,第一件事就是保存控件状态,即ControlState,第二件事就是保存控件视图状态,即ViewState。ControlState我们放到以后再说,今天说说ViewState,在SaveAllState()这个方法内部,调用控件的SaveViewStateRecursive()方法,在这个方法的内部,调用控件的SaveViewState方法
页面到 SaveState 阶段时,会调用自身 SaveAllState() 方法并且在这个方法内部执行两个动作:保存控件状态 (ControlState) 和保存控件视图状态 (ViewState) 。 ControlState 等后面有时间再跟大家分享下,今天主要聊下 ViewState ,在 SaveAllState() 这个方法内部调用控件的 SaveViewStateRecursive() 方法,并且在这个方法内部再去调用 SaveViewState 方法。
Line 5:比较值得注意,平常在设置 ASP.NET 前台页面会经常去接触 EnableViewState 属性,而 flags[disableViewState] 是与 EnableViewState 相对应的。从这里是不是已经 get 到什么了呢?
if (flags[disableViewState])
最后简单写个示例,来看看页面是如何递归保存其内部控件的视图状态:
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Xudaxia.ViewState.Test</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
</div>
</form>
</body>
</html>
上面这个结构就不多说了,来看看这个页面对应的控件树:

在页面生命周期执行时 Page 对象在 SaveState 阶段都发生了什么事?的更多相关文章
- [转]ASP.NET应用程序生命周期趣谈(四) HttpHandler和页面生命周期
在之前的三篇文章中,我们还算简明扼要的学习了asp.net的整个生命周期,我们知道了一个Request进来以后先去ISAPI Filter,发现是asp.net程序后又ASPNET_ISAPI.dll ...
- asp.net页面生命周期
Asp.Net页面生命周期 本文转载自:http://www.cnblogs.com/xhwy/archive/2012/05/20/2510178.html 一.什么是Asp.Net页面生命周期 当 ...
- Asp.Net页面生命周期--转发(学海无涯)
一.什么是Asp.Net页面生命周期 当我们在浏览器地址栏中输入网址,回车查看页面时,这时会向服务器端(IIS)发送一个request请求,服务器就会判断发送过来的请求页面, 完全识别 HTTP 页 ...
- 再学习Webform页面生命周期
参考文章: 在vs2010,新建一个aspx页面,页面头部有一行代码: <%@ Page Language="C#" AutoEventWireup="true&q ...
- Asp.Net页面生命周期【转载,地址:http://www.cnblogs.com/xhwy/archive/2012/05/20/2510178.html】
一.什么是Asp.Net页面生命周期 当我们在浏览器地址栏中输入网址,回车查看页面时,这时会向服务器端(IIS)发送一个request请求,服务器就会判断发送过来的请求页面, 完全识别 HTTP 页 ...
- 【转载】Asp.Net页面生命周期
一.什么是Asp.Net页面生命周期 当我们在浏览器地址栏中输入网址,回车查看页面时,这时会向服务器端(IIS)发送一个request请求,服务器就会判断发送过来的请求页面, 完全识别 HTTP 页 ...
- Asp.Net页面生命周期[转]
一.什么是Asp.Net页面生命周期 当我们在浏览器地址栏中输入网址,回车查看页面时,这时会向服务器端(IIS)发送一个request请求,服务器就会判断发送过来的请求页面, 完全识别 HTTP 页 ...
- 【译】ASP.NET应用程序和页面生命周期
为何翻译此文 一.此文是Code Project社区2010年4月ASP.NET板块的最佳文章,说明了此文的份量: 二.锻炼自己的英文技术文章翻译能力,提高英文技术文档阅读能力: 三.了解掌握ASP. ...
- WebForm页面生命周期及asp.net运行机制
1.先上几张原理图着重理解: 现在针对第四副图原理进行解析: 流程: 1.浏览器发送请求 2.服务器软件(IIS)接收,它最终的目的就是为了向客户输出它请求的动态页面生成的html代码. 3.服务器不 ...
随机推荐
- PT100运算放大器电路
运放输出电压<=运放电源电压,电源电压能决定它的最大输出能力即动态范围,若是电源为0-5v,则输出就只能在这之间. 其次要是放大电路,反馈必须接成负反馈 由于我这次使用的电源是5V,要是采用两 ...
- ltt.js
var dailyBox = $('.daily-box-office'), curDate = new Date(), curYear = curDate.getFullYear(), curMon ...
- 支持Git的代码托管网站
支持Git的代码托管网站: https://github.com/https://code.google.com http://www.codeplex.com/ http://git.oschina ...
- paip.云计算以及分布式计算的区别
paip.云计算以及分布式计算的区别 云计算的特点 1 网格计算 2 分布式计算 2 云计算以及网格计算以及分布式计算的区别 2 作者Attilax 艾龙, EMAIL:1466519819@qq ...
- 怎样通过iPhone Safari 来安装测试版ipa
http://www.cocoachina.com/bbs/read.php?tid=94101# <?xml version="1.0" encoding="UT ...
- SQL Server笔记
SQL Server所能读取的最小单位是页,每个页8KB,8个物理上连续的页就是一个区,这样数据库中每MB就包含有16个区 堆是没有聚集索引的表.如果表格上没有聚集索引,数据行将不按任何特殊顺序存储, ...
- cocos2d_x_08_游戏_FlappyBird
终于效果图: 环境版本号:cocos2d-x-3.3beta0 使用内置的物理引擎 计时器没有加入,可參考[cocos2d_x_06_游戏_一个都不能死] 主场景 // // FlappyBirdSc ...
- esui控件validatebox 通过正则判断输入 json传值
<td> @Html.TextBoxFor(m => m.ActualInvoiceFee, new { @id = "txtActualInvoiceFee", ...
- Docker容器案例:应用 Mysql
原创 杜亦舒 前阶段体验 Mysql 的新版本 5.7.13,由于机器里已经有 Mysql了,再安装另一个版本会有一些麻烦,为了简单,便使用 Docker 容器来安装 可能有人会认为没必要,在一台 ...
- 【ZT】修复iCloud中查找我的iPhone、查找我的iPad无法显示地图的方法
http://blog.sina.com.cn/s/blog_4ff28d30010118cm.html 进入C:\Windows\System32\drivers\etc在hosts文件里加入如下地 ...