导航

asp.net页面事件执行顺序(轉)

Posted on 2010-06-21 09:58  ykhi  阅读(573)  评论(0)    收藏  举报
代码
1 using System;
2  using System.Data;
3 using System.Configuration;
4 using System.Web;
5 using System.Web.Security;
6 using System.Web.UI;
7 using System.Web.UI.WebControls;
8 using System.Web.UI.WebControls.WebParts;
9 using System.Web.UI.HtmlControls;
10 public partial class _Default : Page
11 {
12 protected void Page_Load(object sender, EventArgs e)
13 {
14 }
15 #region OnPreInit 第一步
16 protected override void OnPreInit(EventArgs e)
17 {
18 //检查 IsPostBack 属性来确定是不是第一次处理该页。
19 //创建或重新创建动态控件。
20 //动态设置主控页。
21 //动态设置 Theme 属性。
22 //读取或设置配置文件属性值。
23 //注意
24 //如果请求是回发请求,则控件的值尚未从视图状态还原。如果在此阶段设置控件属性,则其值可能会在下一事件中被重写。
25
26 base.OnPreInit(e);
27 }
28 #endregion
29 #region OnInit 第二步
30 protected override void OnInit(EventArgs e)
31 {
32 //在所有控件都已初始化且已应用所有外观设置后引发。使用该事件来读取或初始化控件属性。
33 base.OnInit(e);
34 }
35 #endregion
36 #region OnInitComplete 第三步
37 protected override void OnInitComplete(EventArgs e)
38 {
39 //由 Page 对象引发。使用该事件来处理要求先完成所有初始化工作的任务。
40 base.OnInitComplete(e);
41 }
42 #endregion
43 #region PreLoad 第四步
44 protected override void OnPreLoad(EventArgs e)
45 {
46 //如果需要在 Load 事件之前对页或控件执行处理,请使用该事件。
47 //在 Page 引发该事件后,它会为自身和所有控件加载视图状态,然后会处理 Request 实例包括的任何回发数据。
48 base.OnPreLoad(e);
49 }
50 #endregion
51 #region OnLoad 第五步
52 protected override void OnLoad(EventArgs e)
53 {
54 //Page 在 Page 上调用 OnLoad 事件方法,然后以递归方式对每个子控件执行相同操作,如此循环往复,直到加载完本页和所有控件为止。
55 //使用 OnLoad 事件方法来设置控件中的属性并建立数据库连接。
56 base.OnLoad(e);
57 }
58 #endregion
59 #region 控件事件 第六步
60 protected void Button1_Click(object sender, EventArgs e)
61 {
62 //用这些事件来处理特定控件事件,如 Button 控件的 Click 事件或 TextBox 控件的 TextChanged 事件。
63 //注意
64 //在回发请求中,如果页包含验证程序控件,请在执行任何处理之前检查 Page 和各个验证控件的 IsValid 属性。
65
66 }
67 #endregion
68 #region OnLoadComplete 第七步
69 protected override void OnLoadComplete(EventArgs e)
70 {
71 //对需要加载页上的所有其他控件的任务使用该事件。
72 base.OnLoadComplete(e);
73 }
74 #endregion
75 #region OnPreRender 第八步
76 protected override void OnPreRender(EventArgs e)
77 {
78 //在该事件发生前:
79 //Page 对象会针对每个控件和页调用 EnsureChildControls。
80 //设置了 DataSourceID 属性的每个数据绑定控件会调用 DataBind 方法。有关更多信息,请参见下面的数据绑定控件的数据绑定事件。
81 //页上的每个控件都会发生 PreRender 事件。使用该事件对页或其控件的内容进行最后更改。
82 base.OnPreRender(e);
83 }
84 #endregion
85 #region SaveStateComplete 第九步
86 protected override void OnSaveStateComplete(EventArgs e)
87 {
88 //在该事件发生前,已针对页和所有控件保存了 ViewState。将忽略此时对页或控件进行的任何更改。
89 //使用该事件执行满足以下条件的任务:要求已经保存了视图状态,但未对控件进行任何更改。
90 base.OnSaveStateComplete(e);
91 }
92 #endregion
93 #region Render 第十步
94 //Render
95 //这不是事件;在处理的这个阶段,Page 对象会在每个控件上调用此方法。所有 ASP.NET Web 服务器控件都有一个用于写出发送给浏览器的控件标记的 Render 方法。
96 //如果创建自定义控件,通常要重写此方法以输出控件的标记。不过,如果自定义控件只合并标准的 ASP.NET Web 服务器控件,不合并自定义标记,则不需要重写 Render 方法。有关更多信息,请参见开发自定义 ASP.NET 服务器控件。
97 //用户控件(.ascx 文件)自动合并呈现,因此不需要在代码中显式呈现该控件。
98 #endregion
99 #region OnUnload 第十一步
100 protected override void OnUnload(EventArgs e)
101 {
102 //该事件首先针对每个控件发生,继而针对该页发生。在控件中,使用该事件对特定控件执行最后清理,如关闭控件特定数据库连接。
103 //对于页自身,使用该事件来执行最后清理工作,如:关闭打开的文件和数据库连接,或完成日志记录或其他请求特定任务。
104 //注意
105 //在卸载阶段,页及其控件已被呈现,因此无法对响应流做进一步更改。如果尝试调用方法(如 Response.Write 方法),则该页将引发异常。
106
107 base.OnUnload(e);
108 }
109 #endregion
110 }
111
112 当页面进行回发时,如点击按钮,以上事件都会重新执行一次,这时的执行顺序为:
113 1. OnPreInit
114 2. OnInit
115 3. OnInitComplete
116 4. OnPreLoad
117 5. Page_Load
118 6. OnLoad
119 7. Button_Click
120 8. OnLoadComplete
121 9. OnPreRender
122 可以看到,Button_Click事件位于OnLoad之后执行,可以测试一下:
123 public partial class TestControls : System.Web.UI.Page
124 {
125 static int count = 0;
126 protected void Page_Load(object sender, EventArgs e)
127 {
128 Response.Write(count+ "Page_Load <br />");
129 count++;
130 }
131 protected override void OnPreInit(EventArgs e)
132 {
133 base.OnPreInit(e);
134 Response.Write(count + "OnPreInit <br />");
135 count++;
136 }
137 protected override void OnInit(EventArgs e)
138 {
139 base.OnInit(e);
140 Response.Write(count + "OnInit <br />");
141 count++;
142 }
143 protected override void OnLoad(EventArgs e)
144 {
145 base.OnLoad(e);
146 Response.Write(count + "OnLoad <br />");
147 count++;
148 }
149 protected override void OnPreLoad(EventArgs e)
150 {
151 base.OnPreLoad(e);
152 Response.Write(count + "OnPreLoad <br />");
153 count++;
154 }
155 protected override void OnLoadComplete(EventArgs e)
156 {
157 base.OnLoadComplete(e);
158 Response.Write(count + "OnLoadComplete <br />");
159 count++;
160 }
161 protected override void OnInitComplete(EventArgs e)
162 {
163 base.OnInitComplete(e);
164 Response.Write(count + "OnInitComplete <br />");
165 count++;
166 }
167 protected override void OnUnload(EventArgs e)
168 {
169 base.OnUnload(e);
170 }
171 protected override void OnDataBinding(EventArgs e)
172 {
173 base.OnDataBinding(e);
174 Response.Write(count + "OnDataBinding <br />");
175 count++;
176 }
177 protected override void OnPreRender(EventArgs e)
178 {
179 base.OnPreRender(e);
180 Response.Write(count + "OnPreRender <br />");
181 count++;
182 }
183 protected void btnGraphics_Click(object sender, EventArgs e)
184 {
185 //Bitmap bmp = new Bitmap(10, 10);
186 //Graphics g = Graphics.FromImage(bmp);
187 Response.Write(count + "btnGraphics_Click <br />");
188 count++;
189 }
190 }