1 常规页生命周期
生命周期:页面请求->启动->初始化->加载->回发事件处理->呈现->卸载。
页生命周期
页面请求 |
页面请求发生在页生命周期前。用户请求时,ASP.NET将确定是否需要分析和编译页,或者可以在不运行页的情况下发送缓存版本进行相应。 |
启动 |
启动阶段,将设置页的属性,如Request和Response。在此阶段,页还将确定是回发请求还是新请求,并设置IsPostBack属性,以及UICulture属性。 |
初始化 |
该时期可以使用页中的控件,并设置控件的UniqueID。如果需要,还会应用母版页和主题。如果当前请求时回发请求,此时回发数据还未加载,还是页面还是原来的值。 |
加载 |
如果是当前请求时回发请求,则将使用从视图状态和控件状态恢复的的信息加载控件属性。 |
回发事件处理 |
如果是回发请求,则调用控件事件处理程序。之后,将调用所有验证程序控件的Validate方法。 |
呈现 |
在呈现前会针对该页和所有控件保存视图状态。在呈现阶段,页会针对每个控件调用Render方法(使用HttpTextWriter),它会提供一个文本编辑器,用于将控件的输出写入页的Response属性和OutputStream对象中。 |
卸载 |
完全呈现页并将页发送到客户端、准备丢弃该页后,引发unload事件。此时,将卸载页属性并执行清理。 |
2 生命周期事件
在生命周期的每个阶段中,页将引发相应的事件。对于空间事件, 既可以通过声明方式使用特性(如Onclick)或使用代码的方式,将事件处理程序绑定到事件。此外,页还支持自动事件连接,即ASP.NET 将查找具有特定名称的方法,并在引发了特定事件时自动运行这些方法。
常用页事件
PreInit |
在启动完成后,初始化开始前引发。 |
Init |
在所有控件完成初始化且以应用所有围观设置后引发。 |
InitComplete |
在页初始化结束后引发。Init和InitComplete事件之间仅发生一个操作:开启对视图状态更改的追踪。使用此事件对要在下一个回发后务必保留的视图状态进行更改。* |
PreLoad |
在页为自身和所有控件加载视图状态后以及处理Request实例包括的回发数据之后引发。 |
Load |
Page对象对Page对象调用Onload方法,然后以递归的方式对每个子控件执行相同操作,直到加载完本页的所有控件为止。各控件的Load时间在页的Load事件之后发生。 |
LoadComplete |
在事件处理阶段结束时引发。对需要加载页上的所有其他控件的任务使用该事件。 |
PreRender |
在page创建用来呈现页的全部控件后引发。递归调用,类似Load。 |
PreRender |
在设置了DataSourceID属性的每个数据绑定控件调用DataBind方法后引发。 |
SaveStateComplete |
在为页和所有控件保存视图状态和控件状态后引发。 |
Unload |
首先针对每个控件引发,继而针对该页引发。主要用来执行最后的清理。 |
*视图状态跟踪使控件可以保留所有以编程方式添加到ViewState集合的值。在开启视图状态跟踪前,所有添加到视图状态的值都会在回发期间丢失。
1 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="LifeCycleDemo.aspx.cs" Inherits="ASP.NetDemo.LifeCycleDemo" %> 2 3 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 4 5 <html xmlns="http://www.w3.org/1999/xhtml"> 6 <head runat="server"> 7 <title></title> 8 </head> 9 <body> 10 <form id="form1" runat="server"> 11 <div> 12 <asp:Label runat="server" ID="labControl" OnLoad="Control_Load" OnUnload="Control_Unload">Label Control Test</asp:Label> 13 <asp:TextBox runat="server" ID="tbControl"></asp:TextBox> 14 <asp:Label runat="server" ID="labBeforeInit"></asp:Label> 15 <asp:Label runat="server" ID="labOnInit"></asp:Label> 16 <asp:Label runat="server" ID="labInitComplete"></asp:Label> 17 18 </div> 19 <div> 20 <asp:Button runat="server" ID="btnRefresh" Text="Refresh" OnClick="Refresh_Click" /> 21 <asp:Button runat="server" ID="btnRedirect" Text="To Default Page" OnClick="Redirect_Click" /> 22 </div> 23 </form> 24 </body> 25 </html>
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using System.Web.UI; 6 using System.Web.UI.WebControls; 7 8 namespace ASP.NetDemo 9 { 10 public partial class LifeCycleDemo : System.Web.UI.Page 11 { 12 Label tmpLabel; 13 14 15 protected void Refresh_Click(object sender, EventArgs e) 16 { 17 Log.WriteLog("Click refresh button." + e.GetType().ToString(), DateTime.Now.ToString()); 18 } 19 20 protected void Redirect_Click(object sender, EventArgs e) 21 { 22 23 Log.WriteLog("Redirect to Default page", DateTime.Now.ToString()); 24 Response.Redirect("Default.aspx"); 25 } 26 27 //PreInit Event 28 protected void Page_PreInit(object sender, EventArgs e) 29 { 30 InitLabel("This is PreInit Event!<br>"); 31 Log.WriteLog("******", "******"); 32 Log.WriteLog("Life Cycle Begin!", DateTime.Now.ToString()); 33 Log.WriteLog("PreInit", DateTime.Now.ToString()); 34 labBeforeInit.Text = tbControl.Text; 35 } 36 37 //Init Event 38 protected void Page_Init(object sender, EventArgs e) 39 { 40 InitLabel("This is Init Event!<br>"); 41 Log.WriteLog("Init", DateTime.Now.ToString()); 42 labOnInit.Text = tbControl.Text; 43 } 44 45 //InitComplete Evet 46 protected void Page_InitComplete(object sender, EventArgs e) 47 { 48 InitLabel("This is InitComplete Event!<br>"); 49 Log.WriteLog("InitComplete", DateTime.Now.ToString()); 50 labInitComplete.Text = tbControl.Text; 51 } 52 53 //PreLoad Event 54 protected void Page_PreLoad(object sender, EventArgs e) 55 { 56 InitLabel("This is PreLoad Event!<br>"); 57 Log.WriteLog("PreLoad", DateTime.Now.ToString()); 58 } 59 60 //Page Load Event 61 protected void Page_Load(object sender, EventArgs e) 62 { 63 InitLabel("This is Load Event!<br>"); 64 Log.WriteLog("Page Load", DateTime.Now.ToString()); 65 } 66 67 //Control Load Event 68 protected void Control_Load(object sender, EventArgs e) 69 { 70 Log.WriteLog("Control Load", DateTime.Now.ToString()); 71 } 72 73 //LoadComplete Event 74 protected void Page_LoadComplete(object sender, EventArgs e) 75 { 76 InitLabel("This is LoadComplete Event!<br>"); 77 Log.WriteLog("LoadComplete", DateTime.Now.ToString()); 78 } 79 80 //PreRender Event 81 protected void Page_PreRender(object sender, EventArgs e) 82 { 83 InitLabel("This is PreRender Event!<br>"); 84 Log.WriteLog("PreRender", DateTime.Now.ToString()); 85 } 86 87 //PreRenderComplete Event 88 protected void Page_PreRenderComplete(object sender, EventArgs e) 89 { 90 InitLabel("This is PreRenderComplete Event!<BR>"); 91 Log.WriteLog("PreRenderComplete", DateTime.Now.ToString()); 92 } 93 94 //SaveStateComplete Event 95 protected void Page_SaveStateComplete(object sender, EventArgs e) 96 { 97 InitLabel("This is SaveStateComplete Event!<br>"); 98 Log.WriteLog("SaveStateComplete", DateTime.Now.ToString()); 99 } 100 101 //Page Unload Event 102 private void Page_Unload(object sender, EventArgs e) 103 { 104 Log.WriteLog("Page Unload", DateTime.Now.ToString()); 105 Log.WriteLog("none", "none"); 106 } 107 108 //Control Unload Event 109 protected void Control_Unload(object sender, EventArgs e) 110 { 111 Log.WriteLog("Control Unload", DateTime.Now.ToString()); 112 } 113 114 115 116 private void InitLabel(string eventInfo) 117 { 118 this.tmpLabel = new Label(); 119 tmpLabel.Text = eventInfo; 120 Page.Controls.Add(tmpLabel); 121 122 } 123 } 124 }
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Text; using System.IO; /// <summary> ///Log 的摘要说明 /// </summary> public class Log { public static void WriteLog(string eventType,string time) { string path = AppDomain.CurrentDomain.BaseDirectory + "Log.txt"; StringBuilder str = new StringBuilder(); str.Append("Time:"+time+"------EventType:"+eventType); StreamWriter sw; if (!File.Exists(path)) { sw = File.CreateText(path); } else { sw = File.AppendText(path); } sw.WriteLine(str.ToString()); sw.Close(); } }