文章教程

6.1Page类

8/31/2020 9:52:39 PM 人评论 次浏览

6.1 Page类

Page类贯穿于Web应用程序执行的整个流程。因此,了解其属性、事件和方法并熟练运用,实现对网页执行过程的控制是必不可少的。

6.1.1 页面的生命周期

在项目中所有的Web页面都继承于System.Web.UI.Page类,要了解Page类,必须知道ASP.NET页面的工作过程:

● 客户端浏览器向Web应用程序进行一个页面的请求。

● 服务器端Web应用程序接收到这个请求,先查看该页面是否被编译过,如果没有先编译这个Web页面,然后对这个页面进行实例化,产生一个Page对象。

● Page对象根据客户请求,把信息返归给IIS,然后信息由IIS返回给客户端浏览器。

● 在这个过程中,每个页面都被编译成一个类,当有请求的时候就对这个类进行实例化。

Page类是从System.Web.UI.TemplateControl类继承而来,对于页面生命周期,一共要关心以下5个阶段。

● 页面初始化:在这个阶段,页面及其控件被初始化。页面确定是新的请求还是回传请求。页面事件处理器Page_PreInit和PageInit被调用。另外,任何服务器控件的PreInit和Init被调用。

● 载入:如果是一个回传请求,控件属性使用从视图状态和控件状态的特殊页面状态容器中恢复的信息来载入。页面的Page_Load方法以及服务器控件的Page_Load方法事件被调用。

● 回传事件处理:如果是一个回传请求,任何控件的回传事件处理器被调用。

● 呈现:在页面呈现状态中,视图状态保存到页面,然后每个控件及页面都是把自己呈现给输出相应流。页面和控件的PreRender和Render方法先后被调用。最后,呈现的结果通过HTTP响应发送回客户机。

● 卸载:对页面使用过的资源进行最后的清除处理。控件或页面的Unload方法被调用。

6.1.2 Page类的方法、属性和事件

Page类与扩展名为.aspx的文件相关联,这些文件在运行时被编译为Page对象,并被缓存在服务器内存中。如果要使用代码隐藏技术创建Web窗体页,需要从该类派生。应用程序快速开发(RAD)设计器(如Microsoft Visual Studio)自动使用此模型创建Web窗体页。Page对象充当页中所有服务器控件的容器。

在代码隐藏模型中,页的标记和服务器端元素(包括控件声明)位于.aspx文件中,而用户定义的页代码则位于单独的代码文件中。该代码文件包含一个分部类,即具有关键字partial的类声明,以表示该代码文件只包含构成该页的完整类的全体代码的一部分。在分部类中,添加应用程序要求该页所具有的代码。此代码通常由事件处理程序构成,但是也可以包括用户需要的任何方法或属性。

代码隐藏页的继承模型描述如下:

(1)代码隐藏文件包含一个继承自基页类的分部类。基页类可以是Page类,也可以是从Page派生的其他类。

(2).aspx文件在“@ Page”指令中包含一个指向代码隐藏分部类的Inherits属性。

(3)在对该页进行编译时,ASP.NET基于.aspx文件生成一个分部类;此类是代码隐藏类文件的分部类。生成的分部类文件包含页控件的声明。使用此分部类,用户可以将代码隐藏文件用作完整类的一部分,而无需显示声明控件。

(4)最后,ASP.NET生成另外一个类,该类从在上面生成的类继承而来。它包含生成该页所需的代码。该类和代码隐藏类将编译成程序集,运行该程序集可以将输出呈现到浏览器。

下面介绍Page类的常见属性和方法,见表6-1所示。

表6-1 Page类的重要属性和方法

alt

(续表)

alt

Page类中有很多属性是对象的引用,比如表6-1中的Request、Response、Application和Session等,这样在页面中可以直接对这些对象进行访问,而无需通过Page对象。比如下面两行代码的作用是一样的。

alt

上面代码中第1行代码通过Page对象的Response属性得到Response对象的引用,第二行直接通过Response对象名对Response对象进行引用。

Page类除了属性和方法外,还有的8个常见的事件,如表6-2所示。

表6-2 Page类的主要事件

alt

表6-2中Page对象的事件贯穿于网页执行的整个过程。在每个阶段,ASP.NET都触发了可以在代码中处理的事件,对于大多数情况,只需要关心Page_Load事件。该事件的两个参数是由ASP.NET定义的,第一个参数定义了产生事件的对象,第二个是传递给事件的详细信息。每次触发服务器控件的时候,页面都会去执行一次Page_Load事件,说明页面被加载了一次。这个技术称为回传(或者称为回送)技术。这个技术是ASP.NET最为重要的特性之一,这样,Web页面就好像一个Windows窗体一样。在ASP.NET中,当客户端触发了一个事件,它不是在客户端浏览器上对事件进行处理,而是把该事件的信息传送回服务器进行处理。服务器在接收到这些信息后,会重新加载Page对象,然后处理该事件,所以Pgae_Load事件被再次触发。

由于Page_Load在每次页面加载时运行,因此其中的代码即使在回传的情况下也会被运行,在这个时候Page的IsPostBack属性就可以用来解决这个问题,因为这个属性用来识别Page对象是否处于一个回送的状态,也就弄清楚是请求页面的第一个实例,还是请求回送原来的页面。可以在Pgae类的Page_Load事件中使用该属性,以便数据访问代码只在首次加载页面时运行,具体代码如下所示。

alt

上面的代码中第1行处理Page页面的加载事件Load。第2行使用Page的IsPostBack属性判断当前加载的页面是否是回送页面。

6.1.3 Page类的使用

前面介绍了Page类的概念以及其属性、方法和事件,这节将通过一个例子来讲述Page类的使用。

【实例6-1】Page类的使用

网页的执行从网页的初始化开始,此时会触发Init事件,Init事件的用途是设置网页或者控件的初始值。同一个网页只会触发一次Init事件,当客户端返回数据时,不会再次触发Init事件。

01 启动Visual Studio 2012,创建一个ASP.NET Web空应用程序,命名为“实例6-1”。

02 在“实例6-1”中创建一个名为Default.aspx的窗体。

03 单击网站的目录下的Default.aspx文件,进入“视图编辑”界面,打开“源视图”,在编辑区中<form></form>标记之间编写如下代码:

alt

上面的代码中第3行在表单中添加一个HTML下拉列表控件Interest。第5行添加一个HTML文本框控件Text1。第6行添加一个HTML按钮控件并设置其单击事件为AddToList_Click。

04 用鼠标单击网站目录下的Default.aspx.cs文件,编写代码如下。

alt

上面的代码中第1行定义处理Page页面Init事件的方法;第2行~第5行通过下拉列表控件Interest的Items.Add方法添加列表项内容。第7行~第9行定义处理按钮控件AddToListClick事件的方法,其中,第8行使用下拉列表控件Interest的Items.Add方法将用户输入在文本框中的内容添加到列表项。

05 运行程序后的结果如图6-1所示。当用户输入新字体颜色“紫色”后,单击“添加”按钮时,会将数据返回到服务器,此时网页被重新加载,但并不会再次触发Page对象的Init事件,如图6-2所示。

alt

图6-1 运行结果1

alt

图6-2 运行结果2

06 如果在Default.aspx.cs文件,将Page_Init事件里的代码编写在Page_Load事件中,如以下代码:

alt

07 运行程序后,当用户输入新字体颜色“紫色”后,单击“添加”按钮时,后页面下拉列表的最下方出现了“紫色”选项,但重复出现了“黑色”、“红色”、“蓝色”和“绿色”选项,如图6-3所示。这时因为Page对象的Load事件被再次触发而又重新将这4个选项添加了一遍。

alt

图6-3 运行结果3

解决这个问题时就用到了Page对象的IsPostBack属性。如果在Page_Load事件中加入一行if(!IsPostBack)来判断网页是在何种情况下加载的,此问题就解决了。

教程类别