`

ASP.NET Page执行顺序如:OnPreInit()、OnInit()……

 
阅读更多

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class _Default : Page
{
protected void Page_Load(object sender, EventArgs e)
{

}

#region OnPreInit 第一步
protected override void OnPreInit(EventArgs e)
{
//检查 IsPostBack 属性来确定是不是第一次处理该页。

//创建或重新创建动态控件。

//动态设置主控页。

//动态设置 Theme 属性。

//读取或设置配置文件属性值。

//注意
//如果请求是回发请求,则控件的值尚未从视图状态还原。如果在此阶段设置控件属性,则其值可能会在下一事件中被重写。

base.OnPreInit(e);
}
#endregion

#region OnInit 第二步
protected override void OnInit(EventArgs e)
{
//在所有控件都已初始化且已应用所有外观设置后引发。使用该事件来读取或初始化控件属性。
base.OnInit(e);
}
#endregion

#region OnInitComplete 第三步
protected override void OnInitComplete(EventArgs e)
{
//由 Page 对象引发。使用该事件来处理要求先完成所有初始化工作的任务。

base.OnInitComplete(e);
}
#endregion

#region PreLoad 第四步
protected override void OnPreLoad(EventArgs e)
{
//如果需要在 Load 事件之前对页或控件执行处理,请使用该事件。

//在 Page 引发该事件后,它会为自身和所有控件加载视图状态,然后会处理 Request 实例包括的任何回发数据。

base.OnPreLoad(e);
}
#endregion

#region OnLoad 第五步
protected override void OnLoad(EventArgs e)
{
//Page 在 Page 上调用 OnLoad 事件方法,然后以递归方式对每个子控件执行相同操作,如此循环往复,直到加载完本页和所有控件为止。
//使用 OnLoad 事件方法来设置控件中的属性并建立数据库连接。

base.OnLoad(e);
}
#endregion

#region 控件事件 第六步
protected void Button1_Click(object sender, EventArgs e)
{
//用这些事件来处理特定控件事件,如 Button 控件的 Click 事件或 TextBox 控件的 TextChanged 事件。

//注意
//在回发请求中,如果页包含验证程序控件,请在执行任何处理之前检查 Page 和各个验证控件的 IsValid 属性。

}
#endregion

#region OnLoadComplete 第七步
protected override void OnLoadComplete(EventArgs e)
{
//对需要加载页上的所有其他控件的任务使用该事件。

base.OnLoadComplete(e);
}
#endregion

#region OnPreRender 第八步
protected override void OnPreRender(EventArgs e)
{
//在该事件发生前:

//Page 对象会针对每个控件和页调用 EnsureChildControls。

//设置了 DataSourceID 属性的每个数据绑定控件会调用 DataBind 方法。有关更多信息,请参见下面的数据绑定控件的数据绑定事件。

//页上的每个控件都会发生 PreRender 事件。使用该事件对页或其控件的内容进行最后更改。

base.OnPreRender(e);
}
#endregion

#region SaveStateComplete 第九步
protected override void OnSaveStateComplete(EventArgs e)
{
//在该事件发生前,已针对页和所有控件保存了 ViewState。将忽略此时对页或控件进行的任何更改。

//使用该事件执行满足以下条件的任务:要求已经保存了视图状态,但未对控件进行任何更改。

base.OnSaveStateComplete(e);
}
#endregion

#region Render 第十步
//Render
//这不是事件;在处理的这个阶段,Page 对象会在每个控件上调用此方法。所有 ASP.NET Web 服务器控件都有一个用于写出发送给浏览器的控件标记的 Render 方法。

//如果创建自定义控件,通常要重写此方法以输出控件的标记。不过,如果自定义控件只合并标准的 ASP.NET Web 服务器控件,不合并自定义标记,则不需要重写 Render 方法。有关更多信息,请参见开发自定义 ASP.NET 服务器控件。

//用户控件(.ascx 文件)自动合并呈现,因此不需要在代码中显式呈现该控件。

#endregion

#region OnUnload 第十一步
protected override void OnUnload(EventArgs e)
{
//该事件首先针对每个控件发生,继而针对该页发生。在控件中,使用该事件对特定控件执行最后清理,如关闭控件特定数据库连接。

//对于页自身,使用该事件来执行最后清理工作,如:关闭打开的文件和数据库连接,或完成日志记录或其他请求特定任务。

//注意
//在卸载阶段,页及其控件已被呈现,因此无法对响应流做进一步更改。如果尝试调用方法(如 Response.Write 方法),则该页将引发异常。

base.OnUnload(e);
}
#endregion
}

当页面进行回发时,如点击按钮,以上事件都会重新执行一次,这时的执行顺序为:

1. OnPreInit
2. OnInit
3. OnInitComplete
4. OnPreLoad
5. Page_Load
6. OnLoad

7. Button_Click
8. OnLoadComplete
9. OnPreRender

可以看到,Button_Click事件位于OnLoad之后执行,可以测试一下:

public partial class TestControls : System.Web.UI.Page
{
static int count = 0;
protected void Page_Load(object sender, EventArgs e)
{
Response.Write(count+ "Page_Load <br />");
count++;
}
protected override void OnPreInit(EventArgs e)
{
base.OnPreInit(e);
Response.Write(count + "OnPreInit <br />");
count++;
}
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
Response.Write(count + "OnInit <br />");
count++;
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
Response.Write(count + "OnLoad <br />");
count++;
}
protected override void OnPreLoad(EventArgs e)
{
base.OnPreLoad(e);
Response.Write(count + "OnPreLoad <br />");
count++;
}
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);
}
protected override void OnDataBinding(EventArgs e)
{
base.OnDataBinding(e);
Response.Write(count + "OnDataBinding <br />");
count++;
}
protected overridevoid OnPreRender(EventArgs e)
{
base.OnPreRender(e);
Response.Write(count + "OnPreRender <br />");
count++;
}

protected void btnGraphics_Click(object sender, EventArgs e)
{
//Bitmap bmp = new Bitmap(10, 10);
//Graphics g = Graphics.FromImage(bmp);
Response.Write(count + "btnGraphics_Click <br />");
count++;
}
}

分享到:
评论

相关推荐

    ASP.NET 页面事件执行顺序介绍

    当页面进行回发时,如点击按钮,以上事件都会重新执行一次,这时的执行顺序为OnPreInit、OnInit、OnInitComplete等等,感兴趣的朋友可以参考下哈

    ASP.NET C# 网页验证码

    ASP.NET C# 网页验证码 private void Page_Load(object sender, System.EventArgs e) { // 在此处放置用户代码以初始化页面 validatenumimage vnimg=new validatenumimage(8); string vnum=vnimg.ValidateNum;...

    一个ASP.NET的JS管理方案,防止重复引用JS问题

     System.Web.UI.Page p = context.CurrentHandler as System.Web.UI.Page;  if (null == p)  {  throw new Exception("HttpContext.CurrentHandler不是Page。");  }  IList jss = ...

    ASP.net 验证码实现代码(C#)

    public class ValidateCode : System.Web.UI.... } #region Web 窗体设计器生成的代码 override protected void OnInit(EventArgs e) { // // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。 //

    asp.net猎头管理系统源码

    功能介绍: 该系统为猎头日常工作所使用系统,包括一般猎头软件所有功能,主要模块有:简历...3.系统角色权限管理采用重写page类的oninit方法,给每个页面以及每个功能赋予id,使得角色权限控制更简单明确,容易管理。

    ASP.NET中后台注册js脚本使用的方法对比

    用Page.ClientScript.RegisterClientScriptBlock 和Page.ClientScript.RegisterStartupScript:区别: 1.使用Page.ClientScript.RegisterClientScriptBlock c#代码 代码如下: &lt;&#37;@ Page Language=”C#” %&gt; ...

    基于.net的连锁中心配送系统

    // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。 // InitializeComponent(); base.OnInit(e); } /// /// 设计器支持所需的方法 - 不要使用代码编辑器修改 /// 此方法的内容。 ///...

    ASP.NET服务器控件的生命周期分析

    本文实例分析了ASP.NET服务器控件的生命周期。分享给大家供大家参考。具体如下: (1)初始化—-在此阶段中,主要完成两项工作:一、初始化在传入Web请求生命周期内所需的设置;二、跟踪视图状态。首先,页面框架...

    ASP.NET 页面中动态增加的控件、添加事件第1/2页

    提醒:WebPartZone只能在OnInit或之前才能创建,否则报异常! 大家都知道,按钮的点击事件是在RaisePostbackEvent时触发的,这意味着点击事件在OnLoad阶段之后才执行,远远落后于 OnInit阶段,而且ViewState在...

    sql语句导致oninit进程占用CPU过高问题定位方法

    sql语句导致oninit进程占用CPU过高问题定位方法

    wxPython学习之主框架实例

    def OnInit(self): wx.MessageBox(Hello jb51.net) return True #返回True表示框架正常运行 if __name__ == __main__: app = MyApp(False) #False参数表示不进行文件重定向 app.MainLoop() 运行效果图如下: ...

    .NET中实现客户端联动菜单 (无刷新)

    // CODEGEN: This call is required by the ASP.NET Web Form Designer. // InitializeComponent(); base.OnInit(e); } /**//// /// Required method for Designer support - do not modify /// the ...

    asp.net 用继承方法实现页面判断session

    public class mana_session : Page { public mana_session() { } protected override void OnInit(EventArgs e) { if (Session[“uid”]== null || Session[“uid”].ToString()==””) { Response.Redirect(...

    wxPython多个窗口的基本结构

    如何在一个wxpython APP里面创建两个框架呢?供大家参考,具体内容如下 代码: import ... import ... class MyFrame(wx.Frame): ... def OnInit(self): self.myframe = MyFrame() self.myframe2 = MyFrame2

    vdom-component

    虚拟组件基于virtual-dom构建...// --- define the component ---var App = { controller: { onInit: function() { this.state.count = 0; }, onClick: function() { this.state.count++; this.props.render(); } }, v

    wingide-4.1.4-1.rar

    def OnInit(self): self.frame=wx.Frame(parent=None, title='彩票神器', size=(400,300)) self.panel=wx.Panel(self.frame,-1) #添加按钮 bmp = wx.Image("12.jpg", wx.BITMAP_TYPE_JPEG).ConvertToBitmap()...

    Informix数据库常用命令介绍

    Informix数据库服务器提供了在shell提示符下直接执行管理任务功能的应用程序。列出这些应用程序:oninit 初始化OnLine dbexport 将数据库卸出到ASCII文件 dbimport 建立数据库 dbload 用命令文件装入数据 dbschema ...

    wxPython窗口中文乱码解决方法

    本文实例讲述了wxPython窗口中文乱码解决方法,分享给大家供大家参考。具体方法如下: 文件保存为 utf-8 ... def OnInit(self):  frame = wx.Frame(parent=None, title=u’我的网站://www.jb51.net’)  fram

    We7 CMS 2.8.2 32位安装包.zip

    We7 CMS基于.net技术的功能强大、操作简单、开放源码的新一代企业级CMS内容管理系统。国内第一家采用开放插件机制的开源CMS,国内第一家全拖拽模板设计的开源CMS,国内第一家内容模型可拖拽定义的开源CMS。 We7 ...

    导入数据库

    .net 导入excel到数据库 先上传Excel文件,然后用OleDB连接Excel文件,将Excel数据导入Dataset,再将Dataset数据导入数据库,最后再将上传的Excel文件删除。 前台: &lt;td width="15"&gt;&nbsp; ...

Global site tag (gtag.js) - Google Analytics