page类提供了四个顺序执行的事件Init,Load,PreRender和Unload,这四个事件是一条主线,依次标明了page类执行的各个阶段。init事件发生在所有服务器端控件的状态(ViewState)被存储之前。load事件发生在所有服务器端控件的状态被存储之后和所有的事件被触发之前。PreRender事件发生在所有事件被触发之后和要回发给客户端的html还没有回发(这个过程也叫"呈现")之前。unload事件发生在所有html都回发完成以后。从这四个事件可以看到page类的大致执行步骤。
详细的page类事件顺序是这样的:获得客户端的post请求-〉page类的继承类被构造-〉page类的ProcessRequest方法被调用->init事件被执行->page类的虚函数CreateChildControls被调用->服务器端控件的状态(来自post变量和ViewState)被存储->load事件被执行->我们自定义的服务器端控件的事件被执行->PreRender事件被执行->page类的虚函数Render方法被调用->page类的虚函数RenderChildren方法被调用->Http响应发往客户端->unload事件被执行->page类的继承类被解构。我们知道一个页面上的控件很多是包含(父子)关系,所以这里的CreateChildControls和RenderChinldren函数应该就不难理解了。
这个事件顺序是理解asp.net页面类的关键,和前面客户端的三个事实结合起来理解,就可以解释asp.net怎么样把客户端和服务器端结合起来,从而实现从脚本编程转移到面向对象编程。无论是微软提供的webcontrols,或者是用户自定义控件,涉及到客户端和服务器端交互,原理都与此类似。
摘自:http://www.cnblogs.com/barney/archive/2008/07/15/1243694.html