ASP.NET页面执行顺序

1.对象初始化(OnInit方法)

 

    页面中的控件(包括页面本身)都是在它们最初的FORM中被首次初始化的。通过在ASPX页面的后台代码文件的构造器中声明你的对象,页面将知道对象的类 型,并知道需要创建多少个这样的对象。一旦你在构造器中声明了你的控件,你就可以在它的任何子类,方法,事件或者属性中访问到它们。但是,如果你的任何对 象是在ASPX文件中指定的控件,这样的控件是没有属性的。而且这样做对从代码中访问它们是危险的,因为无法保证这些控件实例是按照怎样的顺序被创建的 (假定它们都是能完全被创建的)。初始化事件可以通过OnInit方法重载。

 

2.加载视图状态数据(LoadViewState事件)

   初始化以后,控件仅能通过ID引用(还没有建立用于相对引用的文档对象模型)。 在LoadViewState事件中,已初始化的控件获得第一个属性:上一次提交存留到服务器的视图状态信息。页视图状态通过ASP.NET维护,它被用 于在一个往返行程中存留信息到服务器。视图状态信息被保存为一个名称/值对,它包含控件的如Text和Value一类的信息。视图信息被保存在隐 藏<input>控件的值属性中在页请求中传递。正如你所了解的,这是旧的ASP3.0状态维护技术的一个巨大飞跃。这个事件可以通过 LoadViewState方法重载,往往用来在控件被填充时定制它所接受的数据。

 

3.处理回传数据(LoadPostData事件)

    在创建页的阶段,被发送到服务器端的Form数据(ASP.NET中的术语为回传数据)依照每个控件的数据需求进行处理。当页面提交Form时,框架将在 每个提交数据的控件上实现IPostBackDataHandler接口。页面然后激发LoadPostData事件,通过页面解析发现实现了 IPostBackDataHandler接口的控件,并用正确的回传数据更新控件状态。ASP.NET通过匹配控件的唯一标示符来更新正确的控件,该标 示符具有名称值集合中的名称值对。这也就是在所有特定的页中每个控件都需要一个唯一标示符的原因之一。其它的步骤都由框架来完成,以确定每个标示符在环境 中是唯一的,例如存在于单页面中的自定义用户控件。LoadPostData事件被激发后,RaisePostDataChanged事件就可以随时被执 行了。

 

4.对象加载(OnLoad方法)

    对象在Load事件中获得正确的Form。所有的对象首先都被组织在页DOM(ASP.NET中称为控件树)中,并且很容易通过代码或者相对位置 (crawling the DOM)来引用。然后对象就可以自由的访问HTML中的客户端属性集,例如width,value,或者visibility。加载时,控件逻辑,如算 法、以编程方式设置控件属性、用StringBuilder装配输出字符串都同时被执行。大部分的工作都是在这一阶段完成的。Load 事件能够通过调用OnLoad来重载。

 

5.激发RaisePostDataChanged 事件

    如前所述,这发生在所有实现了IPostBackDataHandler接口的控件被正确的回传数据更新以后。在这个过程中,每个控件都有一个布尔值的标 识,标识其自上一次提交后该控件的数据是被更改还是保持原值。然后ASP.NET通过搜索页来寻找任何显示控件数据被更改的标识并激发 RaisePostDataChanged。RaisePostDataChanged事件直到Load事件发生后,所有控件被更新后才激发。这保证了在 控件被回传数据更新前,其它控件的数据在RaisePostDataChanged事件中没有被手动更改过。

 

6.处理客户端回传事件(RaisePostBackEvent事件)

   当回传更新导致数据改变而引发服务器端事件后,引发回传的对象会在RaisePostBackEvent事件中被处理。这种激发回传的对象往往是其状态改 变而引发回传的控件(其autopostback被启用)或者是一个被点击的窗体提交按钮。很多代码都在这个事件中执行,因为这是控制事件驱动逻辑的理想 位置。为了保证呈现到浏览器的数据的正确性,在一系列的回传事件后RaisePostBackEvent事件最终被激发。基于一致性的考虑,回传中改变的 控件直到这个函数被执行后才被更新。也就是说,被预期事件改变的数据总是在结果页反映出来。RaisePostBackEvent事件可以通过 RaisePostBackEvent来捕捉。

 

7.对象预呈现(OnPreRender事件)

   对象被预呈现的地方对于那些能够保存到视图或者维持其视图状态的对象来说是最后一次有机会改变的地方。这使得预呈现步骤成为做最后修改的理想位置,例如改 变控件属性或改变控件树结构,不用担心因为数据库请求或者视图状态更新而导致对象的变化。预呈现阶段之后,对象改变被锁定并且不能再被保存到页视图状态 中。预呈现阶段可以通过重载OnPreRender实现。

 

8.保存视图状态(SaveViewState事件)

   只有在所有的页面对象的改变都发生后视图状态才被保存。对象状态数据被保存在隐藏<input>对象中,这也是对象状态数据准备呈现到 HTML的地方。在SaveViewState事件中,值能够被保存到视图状态对象中,但页面控件的改变并不能保存到其中。可以通过重载 SaveViewState实现这个步骤。

 

9.呈现HTML(Render事件)

    Render事件通过装配用于浏览器输出的HTML来着手页的创建。在Render事件中,页调用对象使它们呈现为HTML,然后页收集HTML来发送。 当Render事件被重载的时候,开发者可以为浏览器创建定制的HTML,此时页面创建的任何HTML都还没有生效。Render 方法用HtmlTextWriter对象作参数并由它产生HTML给浏览器。这里仍然可以作修改,但是这样的修改只会反映到客户(译者注:意即改变只会在 HTML呈现中反映而视图状态并无法被改变)。Render 事件可以被重载。

 

10.释放(Dispose事件)

当页面的HTML呈现后,对象被释放。在Dispose事件中,你可以清除任何在页面创建中构造的对象或者引用。在这里,所有的处理都已经被执行,你可以安全的释放任何还存在的对象,包括Page对象。Dispose能被重载。

具体对应的事件顺序如下:

①Page_Init()     对象初始化;

②LoadViewState   加载视图状态;

③LoadPostData    处理回送数据;

④Page_Load()     页面加载;

⑤RaisePostDataChanged  数据更新并回送事件;

⑥RaisePostBackEvent    处理客户端回传的事件;

⑦Page_PreRender()页面预处理;

⑧SaveViewState   保存视图状态;

⑨Page_Render()   呈现Html静态页面;

⑩UnLoad          释放页面;

 

总结

每次我们请求一个ASP.NET页的时候,这个从初始化到释放的过程都同样的被执行。通过理解ASP.NET页的内部执行过程,编写和调试代码的时候就会更加容易和高效。

下面是具体的代码:

view plaincopy to clipboardprint?
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  
}

 

用UltraISO制作镜像以RAW格式刻录系统到U盘后,在Windows上无法识别的解决办法 在这篇文章中,用UltraISO制作镜像后,会使得U盘无法识别!!!那么,如何抹掉U盘的数据,格式化U盘呢? 阅读详情

相关推荐

STM32F103ZE驱动PMW3901光流模块,从SPI配置到数据读取的完整避坑指南

本文详细解析了STM32F103ZE驱动PMW3901光流模块的全过程,从SPI配置、硬件连接到数据读取与处理,提供了完整的避坑指南。重点介绍了SPI参数配置、初始化序列优化、运动数据滤波等关键技巧,帮助开发者快速实现精准的光流检测。

weixin_42631411的博客 514

asp.net页面事件执行顺序

 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.Web

Mark的专栏 846

相机光学(三十八)——VCM(Voice Coil Motor)音圈马达

VCM(Voice Coil Motor)音圈马达全称Voice Coil Montor,电子学里面的音圈电机,是马达的一种。因为原理和扬声器类似,所以叫音圈电机,具有高频响、高精度的特点。其主要原理是在一个永久磁场内,通过改变马达内线圈的直流电流大小,来控制弹簧片的拉伸位置,从而带动上下运动。手机摄像头广泛的使用VCM实现自动对焦功能,通过VCM可以调节镜头的位置,呈现清晰的图像。弹片式结构滚珠式结构摩擦式结构Open loop开马达Close loop闭环马达。

图像学习之旅 7217

Page.OnPreInit 方法

在页初始化开始时引发PreInit事件。 命名空间: System.Web.UI 程序集: System.Web(在 System.Web.dll 中) 语法 C# protected virtual void OnPreInit( EventArgs e ) 参数 e类型:System.EventArgs...

weixin_30448603的博客 263

STM32开发 -- LIS3DH三轴加速度计开发详解

这次要讲一下LIS3DH三轴加速度计的开发使用,之前是有讲过 MPU6050开发 的,但当时是在Linux下做的。额,还是个半成品,哈哈。现在手边有STM32的开发板,可以实实在在的来实现以下卡尔曼滤波了。 一、LIS3DH初识 依照惯例,先看一下手册,大致先了解一下,LIS3DH是什么模块。 下载:LIS3DH datasheet 1、描述 LIS3DH是一款超低功耗高性能三轴线性加速度计,属于...

不积跬步,无以至千里 2万+

【数据集】中国大气污染物数据集CHAP(1km空间分辨率)-韦晶团队

中国大气污染物数据集CHAP(1km空间分辨率)-韦晶团队

WW、forever的博客 2595

面向对象的3个基本对象

谢谢作者 面向对象的三个基本特征(讲解) 面向对象的三个基本特征是:封装、继承、多态。 封装 封装最好理解了。封装是面向对象的特征之一,是对象和类概念的主要特性。 封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。 继承 面向对象编程 (OOP) 语言的一个主要功能就是 “ 继承 ” 。继承是指这样一种能力

落枫残雪 3525

论文必备 - YOLOv11热力图可视化,支持指定模型,指定显示层,设置置信度,以及10种可视化实现方式

本文带来的是YOLOv11热力图可视化功能,支持,以及。我们经常看到一些论文里绘制了不同的热力图,一方面能够直观的感受其模型的有效性,另一方面也丰富了论文内容。特别是在使用了注意力模块的网络中,热力图就可以验证注意力机制是否真正聚焦到了预期的重要特征上,以便对模型的有效性和合理性进行评估。例如这篇文章中展示的,就很能够表达作者改进后的模型相比之前模型的优越性。

Limiiiing的博客 5504

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

asp.net 页面事件执行顺序(轉) Posted on 2010-06-21 09:58 ykhi 阅读(38) 评 论(0)  编 辑收藏 所属分类: asp.net c#代码 1using System;<br /> 2 using System.Data;<br /> 3using System.Configuration;<br /> 4using System.Web;<br /> 5using System.Web.Security;<br /> 6using

kk5595的专栏 599

华为MetaERP的交易计税模块(即“税务引擎”)在设计上确实受到Oracle E-Business Tax(EBTax)等国际先进税务架构理念的影响,但结合了华为自身全球化运营、多准则合规、高并发处

华为MetaERP税务引擎在借鉴Oracle EBTax三层架构基础上,创新升级为五层智能税务架构,实现从"税码驱动"到"场景+规则+AI驱动"的转变。该模块采用云原生微服务架构,支持全球190+国家税务规则动态加载,具备实时计税、多准则并行处理、AI风险预警等核心能力,深度适配金税工程等国内合规要求。通过税务数字孪生、RPA机器人等创新,形成自主可控的智能税务中枢,为跨国企业提供全栈国产化税务解决方案,重新定义ERP税务管理范式。

金牌架构师 114

从基础到前沿:深度剖析光束整形与扫描技术

光束扫描的核心在于通过特定手段改变光束的传播方向,从而实现对目标区域的扫描。在这个过程中,振镜、声光偏转器、电光偏转器等元件发挥着关键作用。振镜是一种常见的光束扫描元件,它主要由电机、反射镜和透镜组成。当电机驱动反射镜旋转时,根据光的反射定律,反射镜会改变入射光线的反射方向。假设初始时光束垂直入射到反射镜上,当反射镜绕某一轴旋转一定角度时,光束的反射方向就会相应改变,从而实现光束在空间中的扫描。在激光打标设备中,通过控制振镜的快速摆动,能够使激光束在工件表面快速移动,完成各种图案和文字的标记。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 2098

ASP.NET页面主要事件执行顺序

ASP.NET页面主要事件执行顺序 过程 方法 IsNotPostBack IsPostBack IsCallBack & IsNotCallBack 初始化 Constructor √ √ √ AddParsedSubObject √ √ √ DeterminePostBackMode √ ...

albert的专栏 1001

Megatron-LM从头训练大语言模型:并行策略图示【Tensor并行、Pipeline并行、Data并行、Sequence并行、virtual_pipeline并行、Context并行】

节点包含的层每GPU的参数内存每GPU的激活内存节点0Stage 0层1-1212层参数/2 (TP切分)8k序列激活 (CP切分)节点1Stage 1层13-2412层参数/2 (TP切分)8k序列激活 (CP切分)节点2Stage 2层25-3612层参数/2 (TP切分)8k序列激活 (CP切分)节点3Stage 3层37-4812层参数/2 (TP切分)8k序列激活 (CP切分)负载均衡:每个节点处理相同数量的层(12层)内存优化。

u013250861的博客 285

ASP.net中页面事件的先后执行顺序

ASP.net中页面事件的先后执行顺序   客户发出POST请求-〉创建Page派生类,调用构造函数-〉调用Page类的IHttpHandler.ProcessRequest方法-〉激活Page类的Init事件-〉调用Page类的Creat

Everest的博客 (杂七杂八) 1289

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

asp.net 页面的事件执行顺序

<br />默认的aspx页面都是继承自System.Web.UI.Page,Page基类定义了很多需要预执行的事件,这些事件虽没有在aspx页面中显示的定义或提及,但它们仍然会以一定的顺序去执行,这些事件的执行顺序是:<br /><br /> 1. OnPreInit<br /> 2. OnInit<br /> 3. OnInitComplete<br /> 4. OnPreLoad<br /> 5. Page_Load<br /> 6. OnLoad<br /> 7. OnLoadComp

旋转木马的IT小窝 674

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

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

默认的aspx页面都是继承自System.Web.UI.Page,Page基类定义了很多需要预执行的事件,这些事件虽没有在aspx页面中显示的定义或提及,但它们仍然会以一定的顺序去执行,这些事件的执行顺序是: 1. OnPreInit2. OnInit3. OnInitComplete4. OnPreLoad5. Page_Load6. OnLoad7. OnLoadComple...

weixin_30444105的博客 147

转载 asp.net页面事件执行顺序

asp.net页面事件执行顺序usingSystem;usingSystem.Data;usingSystem.Configuration;usingSystem.Web;usingSystem.Web.Security;usingSystem.Web.UI;usingSystem.Web.UI.WebControls;usingSystem.Web.UI.WebControls....

weixin_30725315的博客 53

ASP.NET頁面事件執行順序

如果以單一頁面來說執行順序如下: Page.PreInit Page.Init Page.InitComplite Page.PreLoad Page.Load Page.LoadComplete Page.PreRender Page.PreRenderComplete   如果頁面裡面包了一個Usercontrol 執行順序如下: Page.PreInit

blackField的专栏 1013

ASP.NET 页面事件执行顺序

在作完上图后,无意中看到网上类似的一篇文章,也非常精彩,转载在下面供大家参考。申明,以下内容为转载,因某些原因作者和出处无法考证,本文作者不享有以下内容的版权。Page 执行中将按照如下顺序激活事件:Page.PreInitPage.InitPage.InitComplitePage.PreLoadPage.LoadPage.LoadCompletePage.PreRenderPa

figerDeng的专栏 751

ASP.NET页面生命周期(包含页面的回传和事件触发的执行顺序)

 ASP.NET页面生命周期(包含页面的回传和事件触发的执行顺序)Paul Wilson www.WilsonDotNet.com www.ASPAlliance.com/PaulWilson  概述: 页面的生命周期从大体上区分可以分为以下四个阶段: 1. 初始化阶段(Initialization); 2. 恢复数据阶段(Restore and Load); 3.

vividboy的专栏 6417

ASP.NET页面执行顺序 (HttpModule,HttpHandler)

publicclassHelloWorldModule:IHttpModule{publicHelloWorldModule(){}publicStringModuleName{get{return"HelloWorldModule";}}//IntheInitfunction,register...

weixin_34061555的博客 181

asp.net 页面事件执行顺序

 初始化² 当页面被提交请求第一个方法永远是构造函数。您可以在构造函数里面初始一些自定义属性或对象,不过这时候因为页面还没有被完全初始化所以多少会有些限制。特别地,您需要使用HttpContext对象。当前可以使用的对象包括QueryString, Form以及Cookies集合,还有Cache对象。注意:在构造函数里是不允许使用Session的。² 下一个将执行的方法是AddParsedSu

holyrong的专栏 757
上一篇: asp.net 格式化时间日期
下一篇: ASP.NET中缓存(cache)的控制方法
superweb
博客等级 码龄20年 0粉丝 77原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值