稍作停留的思绪 Web窗体处理阶段
2011-06-16 10:38 CoolJie 阅读(421) 评论(0) 编辑 收藏 举报下图展示了一个ASP.NET 页面处理流程的主要阶段:
这些阶段都是在每一次Web请求时独立发生的。还有许多阶段没有在列表中出现,但是它们通常只是在编写自己的ASP.NET控件时才被使用且不会由页面直接来处理。
- 页面框架初始化
- 用户代码初始化
- 验证
- 事件处理
此时,页面已经被完全装载并且经过了验证。ASP.NET将触发在上次回发后发生的所有事件。大部分情况下,ASP.NET事件有以下两种类型:
- 立即反映事件:包括单击“提交”按钮或者单击其他按钮,图片区域或富Web控件中的链接,它们调用JavaScript方法__doPostBack()来触发一次回发。
- 变化事件:包括改变控件的选择或者文本框的文本。如果Web控件的AutoPostBack属性设置为true,这些事件立即发生。否则,它们会在页面下次返回时发生。
例如,假设一个页面有一个“提交”按钮和一个并不自动回送的文本框。修改文本框中的文本,然后点击“提交”按钮。这时,ASP.NET会触发下列所有的事件:
- Page.Init
- Page.Load
- TextBox.TextChanged
- Button.Click
- Page.PreRender
- Page.Unload
- 自动数据绑定
- 清除
ASP.NET在这个阶段开始创建页面。它产生.aspx网页里用标签定义的所有控件。此外,如果页面不是第一次被请求(而是一次回送),ASP.NET将反序列化视图状态信息并把它们应用到所有的控件上。
Page.Init 事件在这个阶段被触发。网页很少处理这个事件,因为此时执行页面初始化还为时过早。因为此时控件对象还可能没有被创建,视图状态信息也还没有加载。
Page.Load事件在这个处理阶段被触发。大多数网页处理这个事件来执行必需的初始化(如填充控件的属性)
不管页面是第一次请求还是回送,Page.Load事件都会触发。可以通过检查页面的IsPostBack属性来确定页面的当前状态。
需要记住的是,视图状态保存了每个变化了的属性。在Page.Load事件里初始化控件被记为一次变化,所以任何控件值的变化将被序列化到视图状态中,无谓的加大了页面尺寸和延长传送时间。为了简化视图状态并尽量保持小的页面,要避免在代码中初始化控件。而应该在控件标签里设置属性。如果一定要在代码中进行设置,可以将控件的EnableViewState属性设置为false,并且在每次Page.Load事件中初始化控件,而不管是回送页面还是初次请求页面。
ASP.NET引入了自动验证其他用户输入控件并显示错误信息的新验证控件。这些控件会在页面加载之后,其他事件发生之前触发。大部分情况下,只需要在其他事件处理程序中检查页面的属性Page.IsValid。
本质上有两种类型的数据源操作。所以任何改变(增删改)都是在所有的控件事件处理之后,Page.PreRender事件发生之前执行的。在Page.PreRender事件被触发后,数据源控件执行查询并把获得的数据插入到关联的控件中。
这是页面生命周期的最后一站。Page.PreRender事件曾被认为是页面呈现为HTML之前的最后一个动作(其实一些数据绑定工作还可能在预呈现阶段之后发生)。在预呈现阶段,页面和控件对象仍然可用,所以你可以执行最终的步骤,如在视图状态中保持额外的信息。
在页面的生命周期的最后阶段,页面呈现为HTML。页面呈现之后,真正的清除开始并触发Page.Unload事件。这时,页面对象仍然可用,但是最终的HTML已经被呈现并不能修改。