aspx页面事件执行顺序

时间: 2020-06-01 20:02 浏览次数:

aspx页面事件执行顺序

首先,详细版本L初始化。提交页面时,第一个方法始终是构造函数。您可以在构造函数中启动一些自定义属性或对象,但此时有一些限制,因为页面尚未完全初始化。特别是,您需要使用HttpContext对象。当前可用的对象包括查询字符串、表单、Cookies集合和缓存对象。注意:构造函数中不允许会话。

下一个要执行的方法是AddParsedSubObject方法,它添加所有独立的控件并将页面形成一个控件集合树。这种方法经常被一些高级的页面模板解决方案重写,以将页面内容添加到页面模板中的一些特殊控件中。此方法递归应用于所有页面控件和相应的子控件。在此方法中,所有控件都在最早的时间初始化。

页面类中要执行的下一个方法是DeterminePostBackMode。此方法允许您修改IsPostBack和相关事件的值。如果您需要从数据库加载视图状态,这个方法特别有用,因为只有当IsPostBack为真时,视图状态才会被恢复。返回空将导致强制执行非回发,同时返回请求。窗体将强制回发。除非在特殊情况下,建议不要操作它,因为这也会影响其他事件。

下一个要执行的方法是OnInit方法,这通常是第一个实际使用的方法。当触发此方法时,页面定义中的所有控件都将被初始化,这意味着页面中定义的所有值都将应用于相应的控件。但是,视图状态和返回值不会应用于控件,因此由代码或用户更改的任何值都不会恢复到控件中。此方法通常是创建和重新创建动态控件的最佳位置。L恢复并加载下一个方法,LoadPageStateFromPerpersistenceIum将仅在返回页面时执行。如果您修改方法SavePageStateToPersistence,则需要重写此方法,因为您使用的是会话或自定义保存方法,这将在后面提到,并且会影响视图状态保存方法。在默认实现中,视图状态以Base64格式编码,并保存在页面的隐藏字段中。您可以使用本文中提到的方法修改视图状态,并以上述两种方式保存它。注意:此方法实际上不会将视图状态加载到页面或页面控件中。

当获得视图状态时,下一个方法LoadViewSate将递归地将视图状态恢复到页面和每个页面控件或子控件。执行此方法后,每个控件都将返回到其以前的状态,但用户提交的数据尚未应用于控件,因为它们不是视图状态的一部分。此方法主要用于恢复您在其他事件中动态生成的控件的值。它们的值被手动存储在视图状态中,现在无效。

下一个方法是ProcessPostData,它也只在返回时执行,不允许重写。这是页面基类的私有方法。此方法通过匹配控件的名称来恢复相应的用户提交控件的值。这一步意味着整个页面已经完全恢复。唯一要记住的是,所有动态控件都必须在此方法之前创建。此方法也是记录后续变更事件的方法。

下一个方法是OnLoad方法,它通常是最常用的方法,因为它是页面生命周期中所有值被恢复的第一个地方。大多数代码根据IsPostBack判断来决定是否重置控件的状态。您也可以在此方法中调用验证,并检查值是否有效。您也可以在这个方法中建立动态控制项,控制项的所有方法都会被执行,以赶上目前的页面状态,包括检视状态,但不包括传回的值。L事件处理的下一个方法是ProcessPostData,它实际上是前一个方法的另一个调用。它仍然只在回发时执行,不能重写,因为它是一个私有方法。如果这是您第一次查看页面的运行轨迹,您可能会发现这种方法是多余的。但事实上这个方法是必要的,因为在OnLoad中创建的动态控件也需要它们返回的值。此后创建的任何控件都将获得它们的视图状态,但不再获得它们的返回值,也不会触发任何值更改事件。

下一个方法RaiseChangedEvents也只在回发页面中执行,因为它是基类的私有方法,所以不能全部继承。在整个页面生命周期中,值更改事件是根据前一个ProcessPostData记录的控件值是否与提交的值不同而触发的。您可能需要调用验证或检查IsValid的值。这里没有关于多个值更改事件的执行顺序的具体解释。

下一个方法RaisePostBackEvent也是因为作为基类的私有方法不能被继承,并且只能在回发页面中执行。除非使用自动提交,否则这是实际表单提交事件的执行位置,尤其是按钮或表单实际上是使用javascript提交的。如果没有手动调用验证控件,将调用验证。请注意,IE中有一个BUG,它有时允许提交,但不会触发任何事件。

下一个方法是OnPreRender,这通常是在客户端显示页面之前更改页面及其控件的最后机会。您也可以在此方法中创建动态控件,所有方法都将被执行以跟上当前页面状态,包括视图状态,但私有方法不会被执行,这意味着不会有返回值和事件触发器。由于IE中的错误,这是一个无需任何事件就能赶上回发的好地方。下一个保存和显示的方法是保存视图状态。无论它是否是回发页面,它都将被递归执行以保存页面及其所有控件的视图状态。ViewState基本上保存了所有不同于aspx中定义的原始值的值,无论是由代码还是用户更改的。请注意,控制值是根据它们在页面控制树中的位置来保存的,所以如果以后将动态控制添加到错误的位置,将会导致混乱。

下一个方法是保存页面的视图状态。此方法与LoadPageStateFromPresenCompedium一起被重写,以将视图状态保存到会话或其他自定义数据,而不是使用隐藏字段。这对低带宽用户非常有帮助。对于移动设备,会话是默认设置。下面的文章描述了使用上述两种方法保存视图状态的具体细节。请注意,Asp.net中有一个错误:Asp.net要求提交__viewstate字段,即使它是空的。

下一个方法是Render方法,它递归地创建相应控件的html并将其发送到浏览器。此方法被一些页面模板方案重写,以添加一些常见的页眉和页脚,而不是使用服务器控件。他们总是有额外的东西。请注意,这里的更改只能使用纯HTML,因为控件已经在这里生成了。您可以使用StringBuilder、StringWriter、HtmlTextWriter来捕获相应的HTML输出。

最后一个方法是OnUnload,它调用相应的Dispose方法。此方法提供了清空页面中使用的非托管资源的机会,例如关闭打开的文件句柄、以前打开的数据库连接等。请注意,此方法是在页面发送到客户端后执行的,因此它只影响服务器对象,不会显示在页面的显示轨道中。这是页面的生命周期,针对每个请求运行。第二,简化版

事件将在页面执行期间按以下顺序激活:页面。预初始化- >。页面。初始化- >。页面。initcompliante->;页面。预载- >。页面。加载->。页面。加载完成- >。页面。先决条件- >。

页面。预理解完成

如果页面是从页面继承的,如基础页面:系统。一些扩展是在基本页面中进行的,比如权限检查,而其他页面是从基本页面继承的,基本页面和最终页面的事件激活顺序是:

用户界面。预初始化- >。页面。预初始化- >。用户界面。初始化- >。页面。初始化- >。用户界面。initcompliante->;页面。initcompliante->;用户界面。预载- >。页面。预载- >。用户界面。加载->。页面。加载->。用户界面。加载完成- >。页面。加载完成- >。用户界面。先决条件- >。页面。先决条件- >。用户界面。预理解完成- >。页面。预理解完成

如果使用母版页,母版页和内容页中的事件将按以下顺序激活:

内容页面。PreInit

主人。初始化

内容页面。初始化

内容页面。initcompliante

内容页面。预载

内容页面。负荷

主人。负荷

内容页面。加载完成

内容页面。预发布者

主人。预发布者

内容页面。预理解完成

此外,如果ContentPage继承了BasePage,每个事件的执行顺序将变为:

用户界面。PreInit

内容页面。PreInit

主人。初始化

用户界面。初始化

内容页面。初始化

用户界面。initcompliante

内容页面。initcompliante

用户界面。预载

内容页面。预载

用户界面。负荷

内容页面。负荷

主人。负荷

用户界面。加载完成

内容页面。加载完成

用户界面。预发布者

内容页面。预发布者

主人。预发布者

用户界面。预理解完成

内容页面。预理解完成