ASP.NET 页面执行顺序详解
今天整理了一下ASP执行过程,从.net页码的执行周期开始做一个详细的了解.我重写了页面的绝大多数方法.然后加载执行.所得的顺序如下。
方法是每个重写的事件中都输出一个字符,按字符打印出来的先后判断事件执行的顺序。如有不正确之处,还请路过的各位不吝赐教)
前台代码
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApplication1.WebForm1" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> </head> <body> <form id="form1" runat="server"> <div> <asp:button runat="server" text="Button" onclick="Unnamed1_Click" /> </div> </form> </body> </html>
后台代码
public partial class WebForm1 : System.Web.UI.Page { private static int count = 0; //6 protected void Page_Load(object sender, EventArgs e) { Response.Write(count + ".Page_Load <br />"); count++; } //2 protected override void OnPreInit(EventArgs e) { base.OnPreInit(e); Response.Write(count + ".OnPreInit <br />"); count++; } //3 protected override void OnInit(EventArgs e) { base.OnInit(e); Response.Write(count + ".OnInit <br />"); count++; } //7 protected override void OnLoad(EventArgs e) { base.OnLoad(e); Response.Write(count + "OnLoad<br/>"); count++; } //5 protected override void OnPreLoad(EventArgs e) { base.OnPreLoad(e); Response.Write(count + "OnPreLoad<br/>"); count++; } //4 9 protected override void OnLoadComplete(EventArgs e) { base.OnLoadComplete(e); Response.Write(count + "OnLoadComplete<br/>"); count++; } protected override void OnInitComplete(EventArgs e) { base.OnInitComplete(e); Response.Write(count + "OnInitComplete<br/>"); count++; } protected override void OnUnload(EventArgs e) { base.OnUnload(e); //Response.Write(count + "OnUnload<br/>"); count=99999999; } protected override void OnDataBinding(EventArgs e) { base.OnDataBinding(e); Response.Write(count + "OnDataBinding<br/>"); count++; } //10 protected override void OnPreRender(EventArgs e) { base.OnPreRender(e); Response.Write(count + "OnPreRender<br/>"); count=1111; } //8 protected void Unnamed1_Click(object sender, EventArgs e) { Response.Write(count + "Unnamed1_Click<br/>"); count++; } }
根据源码可以看到asp页面的执行顺序,
其实是个很简单的内容。顺便写下Page事件:
事件处理器名称 |
发生时间 |
Page_Init |
在Web窗体的视图状态加载服务器控件并对其初始化。 这是web窗体生命周期的第一步 |
Page_Load |
在Page对象上载入服务器控件。由于此时视图状态信息是可以使用的, 因此载这里可以用代码来改变空间的设置或者载页面上显示文本。 |
Page_PreRender |
应用程序将要呈现Page对象 |
Page_Unload |
页面从内存中卸载 |
Page_Error |
发生未处理的异常 |
Page_AbortTransaction |
事务处理被终止 |
Page_CommitTransaction |
事务处理被接受 |
Page_DataBinding |
把页面上的服务器空间和数据源绑定载一起 |
Page_Disposed |
Page对象从内存中释放掉。这是Page对象生命周期中的最后一个事件 |
注意:
1)切记用户控件也被视为页面中的一个控件;
2)把用户控件作为单独的一个特殊页面来看,它本身及其所包含的控件同样遵守相同的规律;
3)有时在客户端程序(如javascript)中会用到客户端body对像的onload事件,注意这个客户端事件是最后执行,即在服务器端所有事件执行完后才执行。