您的位置:首页 > 其它

在页面生命周期执行时 Page 对象在 SaveState 阶段都发生了什么事?

2016-10-15 10:34 495 查看
先看下 SaveViewState 的源码:

1 // Answer any state this control or its descendants want to save on freeze.
2         // The format for saving is Triplet(myState, ArrayList childIDs, ArrayList childStates),
3         // where myState or childStates and childIDs may be null.
4         internal object SaveViewStateRecursive() {
5            if (flags[disableViewState])
6                 return null;
7
8           object adapterState = null;
9            if (_adapter != null) {
10                 adapterState = _adapter.SaveAdapterViewState();
11             }
12
13             object controlSavedState = SaveViewState();
14
15            ArrayList childStates = null;
16             if (HasControls()) {
17               ControlCollection occasionalFieldControls = _occasionalFields.Controls;
18                int occasionalFieldControlCount = occasionalFieldControls.Count;
19
20               bool useId = LoadViewStateByID;
21                for (int i = 0; i < occasionalFieldControlCount; i++) {
22                     Control child = occasionalFieldControls[i];
23                     object childState = child.SaveViewStateRecursive();
24                     if (childState != null) {
25                       if (childStates == null) {
26                            childStates = new ArrayList(occasionalFieldControlCount);
27                         }
28
29                        if (useId) {
30                           child.EnsureID();
31                             childStates.Add(child.ID);
32                        }
33                        else {
34                             childStates.Add(i);
35                       }
36                         childStates.Add(childState);
37                    }
38                 }
39            }
40
41             if (_adapter != null) {
42                 if ((controlSavedState != null) || (adapterState != null) || (childStates != null)) {
43                    return new Triplet(controlSavedState, adapterState, childStates);
44                 }
45             }
46            else {
47                 if ((controlSavedState != null) || (childStates != null)) {
48                    return new Pair(controlSavedState, childStates);
49                }
50           }
51
52             return null;
53        }


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>


上面这个结构就不多说了,来看看这个页面对应的控件树:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: