当前位置: 首页 > 编程日记 > 正文

ASP.NET - Page 的生命周期

初始化(Initialization)

页面被请求时,第一个被执行的总是构造函数(constructor). 你可以在这里初始化很多自定义属性或对象。不过这里有一些限制,因为 page 还没有被完全初始化。特别地,你必须使用 HttpContext.Current 来访问 QueryString, Form, Cookies 集合,以及 Cache 对象。而 Session 对象在 constructor 里是无法访问的。

下面接着执行的是 AddParsedSubObject 方法,这个方法把组成该 page 的所有子控件添加到控件集合树中。在很多高级的页面模板解决方案中,该方法通常被覆盖,以便把页面的控件添加到一个特殊的页面模板中去。该方法递归的被子控件调用,所有这些子控件都是这时候初始化的,从最里面的开始。

接着是 DeterminePostBackMode 方法。该方法允许你影响 IsPostBack 的值,以及相关事件。如果你想从数据库中加载 ViewState 以便 redirect 时,这个可能对你有用。因为 ViewState 仅仅在 IsPostBack 为 true 的时候被恢复。
你可以通过返回 null 来强制不 postback, 或者返回 Request.Form 来强制 postback. 这个方法是不推荐使用的,除非是在特殊的情况下,因为他还影响其他的事件。

然后是 OnInit 方法。通常这是我们使用到的第一个方法。这时,所有控件已经被初始化,也就是说所有原始值都被设定了。而 ViewState 以及所有其他 post 的值还没有被应用到控件上。也就是说这时候所有通过代码或者用户操作做的更改还没有被恢复。这通常是创建或重新创建动态控件的最佳时机。

恢复和加载(Restore and Load)

接下来的 LoadPageStateFromPersistenceMedium 方法,仅仅在 PostBack 时被执行。当你要改变保存 ViewState 的方法时(使用 Session 或其他自定义的储存方法),覆盖这个方法,以及后面的 SavePageStateToPersistenceMedium 方法。注意:该方法并不真正加载 ViewState 到 page 及其子控件。

ViewState 被取回后,接着 LoadViewState 方法将它们恢复到 page, 并递归的恢复到每一个子控件(只有 PostBack 的那些).这时,每个控件已经被恢复到了它上次执行时的状态,但用户 post 的值还没有被应用。因为这属于 ViewState. 这个方法是恢复所有在事件中创建的动态控件的最好时机。

下一个是 ProcessPostData 方法。仅仅在 PostBack 时被执行。而且这个方法不能被覆盖,因为它是页面基类中实现的一个私有方法。这个方法最终将用户 post 的值,通过匹配控件的名称的方法,恢复到页面。这时,page 已经被完全恢复了。动态控件必须在这个方法之前被创建。这个方法同时也为稍后的 changed 事件记录控件值的改变。

然后才是 OnLoad 方法。大部分的代码中都使用这个方法,因为这是在 page 的生命周期中,第一个所有的值都被恢复了的地方。我们可以通过检查 IsPostBack 属性来避免不必要的重设状态。同时也可以检查 IsValid 属性来进行验证。同时还可以在这里创建动态控件。所有这些控件的方法都会被执行并捕获,包括 ViewState. 但回发的值不可以。

Raised Events

下一个方法,ProcessPostData 方法, 实际上是前面那个方法的第二个入口(second pass)。它仅仅处理回发,而且由于是私有方法,所以不能被覆盖。这个方法显得有些奇怪,但又是必要的。因为在 OnLoad 方法中重建的动态控件需要他们回发的值。所有在这个方法之后创建的动态控件,将只能恢复 ViewState, 而不能恢复回发的值,并且不能触发任何更改事件。

下一个方法, RaiseChangedEvents, 同样仅仅用于回发时。它是一个基类实现的私有方法。这时 changed 事件被真正触发。这基于前面 ProcessPostData 方法中标注出回发的值的差异。当有多个 changed 事件被触发时,其先后顺序是没有保证的。

下面是 RaisePostBackEvent 方法。仅用于回发,而且是基类实现的私有方法。这是真正提交 form 的方法,除非是 postback。比如按钮,或者其他通过 javascript 提交的控件被触发。如果使用了 Validators, 如没有手动调用 Validate 方法,这时也已经被调用了。有时候 ie 的 bug 会使得表单被提交,而不引发事件。

接着是 OnPreRender 方法。这通常是在被绘制到浏览器之前,要更改 page 及其子控件的最后机会。你也可以在这里创建动态控件。但这时只能捕获 ViewState, 而不能接受 posted values, 而且没有事件。因为上面提到的 ie 的 bug, 这里可以用来捕获没有触发事件的 post back.

保存和绘制(Save and Render)

下一个是 SaveViewState 方法。 不管是否 post back. 递归的应用到每一个子控件。ViewState 一般保存所有和 aspx 页面里不一样的属性,不管是被代码还是用户更改的。注意,由于控件的值是通过他们在控件树中的位置来保存的,所以如果在这之后添加动态控件到错误的位置, ViewState 可能会崩溃。

下面是 SavePageStateToPersistenceMedium 方法。它真正的保存 page 的 ViewState. 这个方法可覆盖。如果重写的话,注意这里由于 asp.net 的 bug, 需要手工设定一下 __VIEWSTATE,哪怕是空值。

接着是 Render 方法。它递归的调用到每个子控件,真正的绘制各自的 html, 发送到浏览器。在一些页面模板方案中,常常在这里添加通用的 header 和 footer. 而不用使用服务器控件。 注意在这里能作的更改必须是纯的 html. 因为这时候控件都已经绘制完了。

最后是 OnUnload 方法。它调用了 Dispose 方法。这个方法可以用来清理页面中使用的非托管资源。特别是类似于关闭打开的文件或数据库连接等。该方法只有当页面已经被发送到客户端浏览器后才发生。所以它只能对服务端的对象起作用。所以他不能在 page 的 trace 中被显示。

上面就是 page 的生命循环。每次有一个新的请求时,以上过程就重复一次。

Listing 1: Page 的事件小结
 
MethodPostBackControls
ConstructorAlwaysAll
AddParsedSubObjectAlwaysAll
DeterminePostBackModeAlwaysPage
OnInitAlwaysAll

LoadPageStateFromPersistenceMediumPostBackPage
LoadViewStatePostBackAll
ProcessPostData1PostBackPage
OnLoadAlwaysAll

ProcessPostData2PostBackPage
RaiseChangedEventsPostBackPage
RaisePostBackEventPostBackPage
OnPreRenderAlwaysAll

SaveViewStateAlwaysAll
SavePageStateToPersistenceMediumAlwaysPage
RenderAlwaysAll
OnUnloadAlwaysAll

原文:http://www.cnblogs.com/dudu/articles/118917.html

转载于:https://www.cnblogs.com/raysbo/archive/2011/04/25/2028740.html

相关文章:

【视频点播最佳实践】视频点播播放异常排查

阿里云视频点播是集音视频采集、编辑、上传、自动化转码处理、媒体资源管理、分发加速、视频播放于一体的一站式音视频点播解决方案。但是对于使用者来说经常遇到的问题即是视频点播中的视频如何对外提供服务,并且当播放出现异常时如何进行排查呢?本文主…

Java程序员技术培训需要培训哪些?

随着java技术行业的不断发展,越来越多的人想要学习java技术,那么想要成为一名优秀的java工程师,需要学习的技术知识是非常多的,下面小编就为大家详细的介绍一下Java程序员技术培训需要培训哪些? Java程序员技术培训需要培训哪些?…

VS2008 VS2010发布网站时如何产生固定命名的 Dll 文件

VS2008 发布网站时如何产生固定命名的 Dll 文件dev.firnow.com 时间 : 2010-12-08 作者:网络 编辑:fnw 点击: 82 [ 评论 ]--VS2008 在发布网站时,bin 目录里为所有 cs 生成的 dll 文件每次都是随机命名的&#…

LeetCode实战:两数相加

题目英文 You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list. You may assume the two nu…

计算机中的概念: 视图 VS 镜像

这两个概念还是不太一样的。下面来说说个人的理解,记录一下。 1. 镜像 镜像可以理解为一份完全一样的拷贝。也就是"深度拷贝",一个复制品。 比如 iso映像文件,ubuntu-12.04.5-desktop-amd64.iso 比如 数据的多副本,用于…

Python入门学习方法有哪些?

Python编程语言是相对比较简单的一门编程语言,在IT行业,很多零基础学员都会优先选择Python语言进行学习,希望可以进入到IT这个大家庭,那么想要学好Python编程,针对Python入门学习方法有哪些呢?来看看下面的详细介绍。…

LeetCode实战:寻找两个有序数组的中位数

题目英文 There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log (mn)). You may assume nums1 and nums2 cannot be both empty. Example 1: nums1 …

从Preact了解一个类React的框架是怎么实现的(一): 元素创建

首先欢迎大家关注我的掘金账号和Github博客,也算是对我的一点鼓励,毕竟写东西没法获得变现,能坚持下去也是靠的是自己的热情和大家的鼓励。  之前分享过几篇关于React的文章: React技术内幕: key带来了什么React技术内幕: setState的秘密其…

呵呵,哈哈,嘿嘿,从今天起就开始写博客文了

第一篇嘛,完完全全的水篇,因为确实不知道该写些什么好啦,恩,哈,以后就多写一些的了,嘘,玩别的去了!拜拜!转载于:https://www.cnblogs.com/thinkgao/archive/2011/04/26/2…

UI设计培训怎么选择就业方向

相信大部分人学习UI设计就是为了找到一份不错的工作,那么UI设计培训怎么选择就业方向呢?UI设计师有哪些就业方向选择呢?来看看下面的详细介绍吧。 UI设计培训怎么选择就业方向? 图形设计:图形设计不仅仅是美术的设计。在UI设计的工作中,图…

用JavaScript获取URL中的参数值

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"> <title>测试JS获取…

LeetCode实战:最长回文子串

题目英文 Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000. Example 1: Input: "babad" Output: "bab" Note: "aba" is also a valid answer.Example 2: Input: &quo…

2017年9月11日 梁勇 java教材 编程练习题 第二章 2.15 键盘 读取两个点的坐标值(小数),控制台输出两点间距离。...

package com.swift;import java.util.Scanner;public class PToP {public static void main(String[] args) {Scanner scannew Scanner(System.in);System.out.println("请输入第一个点的坐标值x1");Double x1Double.parseDouble(scan.nextLine());System.out.printl…

学习java技术有前途吗

java技术在我国的普及已经是非常广泛的了&#xff0c;很多人都知道&#xff0c;java行业的发展前景是非常好的&#xff0c;但竞争压力也是非常大的&#xff0c;到底学习java技术有前途吗?来看看下面的详细介绍。 学习java技术有前途吗?目前按照各类招聘来看&#xff0c;Java的…

充分理解表达式——《狂人C》习题解答2(第二章习题5)

/* 编程求1357911。 */ #include <stdio.h> #include <stdlib.h>int main( void ) {printf ("1357911") ; printf ("%d\n" , 1 3 5 7 9 11 ) ;system("PAUSE"); return 0;}这个题目的主要目的有两个&#xff1a; 1.掌握写整…

LeetCode实战:整数反转

题目英文 Given a 32-bit signed integer, reverse digits of an integer. Example 1: Input: 123 Output: 321Example 2: Input: -123 Output: -321Example 3: Input: 120 Output: 21Note: Assume we are dealing with an environment which could only store integers …

深度洞悉2017企业IT三大关注焦点

本文讲的是深度洞悉2017企业IT三大关注焦点【IT168 云计算】随着经济走向整体放缓&#xff0c;2017有哪些议题会受到企业IT的关注? 一&#xff1a;如何提升员工工作体验 随着80后、90后成为职场主力军&#xff0c;数字化工作场所的推行与建立日渐成为主流&#xff0c;企业将更…

APP测试和传统软件测试有什么区别

APP测试和传统软件测试有什么区别?APP测试和传统测试是有一些区别的&#xff0c;移动APP的特点使得它与传统软件在开发、测试方面都有所不同。比较移动APP测试与传统软件测试的不同&#xff0c;要从以下几个方面进行考虑&#xff1a; (1) 页面布局不同 对于传统软件&#xff0…

LeetCode实战:字符串转换整数 (atoi)

题目英文 Implement atoi which converts a string to an integer. The function first discards as many whitespace characters as necessary until the first non-whitespace character is found. Then, starting from this character, takes an optional initial plus or…

[C#] enum 枚举

默认情况下&#xff0c;枚举第一个值是0&#xff0c; 可显式为枚举赋值。 可以定义枚举的基础类型&#xff0c;如enum E : short {}, sizeof(E) 2&#xff1b;默认情况下是int。 枚举的继承链&#xff1a;ValueType->Enum->enum 枚举类型和基础类型之间的转换都是显式的…

制作Windows Mobile程序安装包

使用Visual Studio 2005制作wm上的cab安装包 打开项目&#xff0c;解决方案中添加新项&#xff0c;添加"智能设置CAB项目"&#xff1b;或者在空VS中新建一个"智能设置CAB项目" 添加新项 左侧的Program Files文件夹&#xff0c;没用可以删除 添加项目主输出…

学Java需要下载什么软件?都有什么作用?

学习java并非大家想象中的那么简单&#xff0c;除了书本和老师面授&#xff0c;软件的使用也有很大的作用&#xff0c;接下来小编为大家分享的就是关于“学Java需要下载什么软件?都有什么作用?”的内容&#xff0c;希望能够给正在学习java知识的同学带来帮助。 学Java需要下载…

一种新的攻击方式:使用Outlook 表单进行横向渗透和常驻

本文讲的是一种新的攻击方式&#xff1a;使用Outlook 表单进行横向渗透和常驻&#xff0c;背景最近我们针对CrowdStrike服务进行例行调查&#xff0c;发现了一种攻击方法&#xff0c;其主要用于横向渗透和系统常驻&#xff0c;而且是以前我们没有看到过的。这种攻击利用Microso…

ACM 1740 A New Stone Game http://acm.pku.cn/JudgeOnline/problem?id=1740

题目大意:有N堆石头,每堆石头数目在1到100之间,最多有10堆.两人分别取走石头.取石头的规则是:每次只能从1堆中取,每次取走至少1个.取过后还可以把这堆的石头任意分配到其它堆上(这些堆必须有石头,废话呵呵),当然也可以不分配.问给定这些石头堆的情况,两人轮流取,谁先取完谁胜利…

LeetCode实战:回文数

题目英文 Determine whether an integer is a palindrome. An integer is a palindrome when it reads the same backward as forward. Example 1: Input: 121 Output: trueExample 2: Input: -121 Output: false Explanation: From left to right, it reads -121. From ri…

安全测试的基本原则有哪些?

软件测试顾名思义就是要进行软件安全方面的测试&#xff0c;对于软件测试人员来说&#xff0c;软件安全是一个广泛而复杂的主题&#xff0c;完全避免软件安全缺陷问题是不切实际的&#xff0c;但通过安全测试可以发现并修复软件大部分安全缺陷。下面介绍一些安全测试的基本原则…

LeetCode实战:盛最多水的容器

题目英文 Given n non-negative integers a1, a2, …, an, where each represents a point at coordinate (i, ai). n vertical lines are drawn such that the two endpoints of line i is at (i, ai) and (i, 0). Find two lines, which together with x-axis forms a conta…

微软极品Sysinternals Suite工具包使用指南

微软极品Sysinternals Suite工具包使用指南 按照名称首字母排序&#xff0c;点击每个蓝色标题链接都可以转到微软的对应官方页面&#xff0c;有对这些工具包的直接下载地址和更详尽的用法。因为每个软件几乎都可以长篇大论的介绍&#xff0c;所以&#xff0c;在此就只做简介和罗…

【布局】圣杯布局双飞翼布局

背景 随着前端技术的发展推进&#xff0c;web端的布局方式已基本成熟&#xff0c;那么在网站布局方式中&#xff0c;三列布局最为常用&#xff0c;布局方式也有很多&#xff0c;渐渐的开发者们开始从效率的角度优化自己的代码“如果三排布局能将中间的模块放在dom树前面&#x…

UI设计师面试如何操作才能获得高薪

UI设计师在近几年是非常吃香的&#xff0c;求职招聘网站上对于UI设计师的要求也越来越高&#xff0c;那么在面试的过程中UI设计师面试如何操作才能获得高薪呢?来看看下面的详细解析。 UI设计师面试如何操作才能获得高薪? 1、行为举止得体大方 我们先从仪态体态方面说&#xf…