发现最近总有网友写自定义控件,但是对页面的生命周期不是很熟悉,在这我翻译Jesse Liberty书中关于生命周期的部分给大家,希望有所帮助
当用户在浏览器中输入网址. 一个伴随着文字,图片,按钮的网页就出现了,她在text box中输入文字后点击按钮提交,那么在后台会发生些什么呢?
每次请求web服务器都会进行有步骤的响应. 这些步骤,从开始到结束,就构成了也面的生命周期
当一个也面被请求,它被载入, 处理, 发送给用户, 被卸载. 从一次生命周期的结束到另一次结束, 主要是向浏览器呈现一些HTML. 每一步, 都有很多可用的方法和事件让你来重载默认的页面载入设置.
为了充分理解页面和控件的生命周期,搞懂Page页类如何在页面上创建一个分层的控件树是必要的,除了页面上的一些注释和页面指令外,页面上的所有组件 ,都是控件树的一部分. 你可以在任何页面指令上加入adding trace="true"来查看页面的控件树
Page类是控件树的根,所有的控件在控件树中,通过控件标识control ID被引用.静态文本,包括空格,换行, HTML标记在树中通过LiteralControls表示.树中控件的次序是严格分层次级别的,在一个给定的层次级别中,控件树中的所有控件同时显示在page中
下面将详细描述WEB页上的组件在生命周期的每一状态. 其中events在生命周期中的第一次加载页面和后来的页面回传有些细微的差别.下面图就是表示的就是页面的周期
如果页面是第一次载入,那么生命周期是由下面几个步骤组成的:
1. 初始化
初始化阶段是任何页面或控件生命周期的第一阶段.在第一阶段构建了控件树. 初始化阶段通过控制Init事件和OnInit方法进行修改
2.加载
加载用户端输入,并且页面控件显示客户端输入数据,加载阶段可以通过控制Load事件和OnLoad方法进行修改
3.预呈现
这个阶段就在输出被呈现之前,子控件被访问了, 在预呈现
中, CreateChildControls方法被访问,如果有必要,可以在控件树中创建和初始化服务器控件. 可以通过PreRender事件和 OnPreRender进行修改
4.保存视图状态
视图状态被保存到页面一个不可见的隐藏字段中.保存视图状态阶段中可以通过使用SaveViewState方法进行重载
5呈现
页面和控件被以HTML的形式呈现,你可以重载Render方法, 在Render方法中, CreateChildControls方法被访问, 如果有必要, 可以在控件树中创建和初始化服务器控件.
6.销毁
这是生命周期的最后阶段. 它给你一个机会来清理和释放一些”昂贵”资源的引用,例如数据库连接.可以使用 Dispose方法进行修改
在用户提交页面后, 生命周期是:
1. 初始化
和第一次加载相同.
2. 加载视图
控件的属性通过提交的页面的隐藏字段来加载, 你可以通过重载 LoadViewState 方法来修改他.
3. 加载回传数据
在这个阶段, 数据通过POST方法被发送到服务器上.经过LoadPostData方法所有的视图状态的更新成为必要
页面加载
和第一次加载相同.
4. 唤醒改变事件
如果当前状态和提交前的状态有所不同,那么改变事件就通过RaisePostDataChangedEvent被唤醒,如:TextBox的Text值改变,有了输入,等等
5. 处理回传事件
确切的说当一个用户行为触发了回传(例如点击提交按钮), 在所有的改变事件被处理后,回传事件才在RaisePostBackEvent方法中被处理
6.预呈现
和第一次加载相同.
7保存视图状态
和第一次加载相同.
8呈现
和第一次加载相同.
9销毁
和第一次加载相同.