当页面运行至SaveState阶段时,将调用其自身SaveAllState()方法,在这个方法内部,做了两件事,第一件事就是保存控件状态,即ControlState,第二件事就是保存控件视图状态,即ViewState。ControlState我们放到以后再说,今天说说ViewState,在SaveAllState()这个方法内部,调用控件的SaveViewStateRecursive()方法,在这个方法的内部,调用控件的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
}
2
3
4
第5行代码,需要引起我们的注意,flags[disableViewState]和控件的EnableViewState属性想对应。
下边用一个简单的示例,来描述一下页面是如何递归保存其内部控件的视图状态:
上边的代码列出了一个简单页面和其对应的cs页面代码。
这个页面对应的控件树为:
下边列出Page、HtmlForm、Literal这三个主要对象的顺序图: