我们知道,页面的每次回发,都少不了LoadState阶段,在这个阶段,我们调用页面的LoadAllState()方法,下边我们看看这个方法的源码:
1
}
在这个方法中,第3行,通过LoadPageStateFromPersistenceMedium()方法,得到一个Pair对象,Pair.First对应的是控件的ControState,这个我们放到以后再谈,Pair.Second对应控件的视图状态。第44行,调用控件的LoadViewStateRecursive方法,这个方法是递归载入控件视图状态的开始,下边我们列出这个方法的源代码:
1
在上边的源代码中,第11行,将传入的object对象转换成Pair或Triplet对象,具体转换成什么对象,和Control.SaveViewStateRecursive有直接的关系,对比着SaveViewStateRecursive方法的实现,要理解LoadViewStateRecursive很容易。我们这里暂且也Pair对象为例,我们在代码的30-31行能看到,Pair.First对应当前控件的视图状态,如果这个视图状态不为null,将调用控件的LoadViewState方法。在代码的第34-41行能看到,Pair.Second是当前控件的子控件的视图信息,通过LoadChildViewStateByID方法或LoadChildViewStateByIndex方法,将试图状态传递给子控件。在这两个方法内部,又会调用子控件的LoadViewStateRecursive方法,开始新一轮的循环。我们用下边一段简单的来做一个说明:
这段代码在页面的LoadState阶段,Page,HtmlForm,Literal这三个对象对应的顺序图为: