简要描述ASP.NET的页面生命周期

考点】
ASP.NET页面生命周期的理解。
【出现频率】
★★★★☆
【解答】
当ASP.NET运行库收到某个*.aspx的访问请求后,将开始这个页面的生命周期。首先,ASP.NET运行库将调用这个页面类的默认构造函数,对应的页面对象将在内存中创建,这个页面类即为*.cs代码文件中定义的类(派生于System.Web.UI.Page类)。页面对象创建后,将触发一系列的事件,这些事件的过程主要为:Init、Load和PreRend,当页面周期结束时将触发Unload事件。
【分析】
本题在ASP.NET相关的面试中出现频率很高,因为ASP.NET虽然和ASP名称相似,其内部原理却相差甚远。通过ASP.NET页面的生命周期分析,可以从整体上把握页面编程的原理,以解决实际中的页面事件问题。ASP.NET页面的生命周期中的事件及相应分析如下:
1.Init过程

该过程即为页面初始化过程,严格细分后,这个时候应该有3个事件,按触发顺序依次为PreInit、Init和InitComplete事件。其中PreInit事件在页面初始化开始时发生,这时ASP.NET框架开始分配WEB控件、确定母版页以及设置用户个性化设置等。并且所有设计时创建的控件都将使用默认值进行初始化,例如,在*.aspx文件中有控件标签编写如以下代码所示。
<asp:Label runat="server" ID="MyLb" Text=”Hello” />
这时,字符串“Hello”将被赋值给“ID”属性为“MyLb”的Label控件。不仅如此,编程者还可以在该事件的处理方法中动态地创建控件。
接着是Init事件和InitComplete事件。InitComplete事件在初始化过程完成时触发,页面中声明的所有控件都已初始化,但页面的状态(ViewState)尚未填充。
Init过程在页面初始化时发生。这个时候,编程者可以读取控件的属性(在设计模式中所设置的),但是不能读取用户设置的值。因为得到用户设置的值是在LoadPostData()事件被触发之后,但是编程者可以获取POST数据。Init过程可以区分*.aspx中的控件是否为动态控件,在此过程之前加入到控件树的控件其处理过程就和*.aspx中静态声明的一致。在页面初始化的过程中不能使用ViewState,因为此时ViewState还没加载。
2.Load过程
即页面载入过程。如果页面是回发的(即“IsPostBack==true”),那么首先将触发LoadViewState事件,ASP.NET运行库将从隐藏域(隐藏字段)中分离出ViewState并加载到所有启用了ViewState的控件。接着还将触发LoadPostBackData事件,即可实现了IPostBackDataHandler接口的控件(如TextBox)从HTTP的POST数据中得到值。
当然,如果页面是首次访问,则没有以上两个事件,Load过程同样可分为PreLoad、Load、LoadComplete这三个事件。在整个Load过程中,页面与其控件已经完全初始化,这时,编程者编写代码与WEB页面所有的部件交互是安全的。“Page_Load”方法是使用比较频繁的事件处理方法,编程者即可在方法中编写页面载入时所要执行的代码。在LoadComplete事件之前会再次尝试加载POST数据,和第一次一样,不过第一次执行时已在控件树上的控件不会受到第二次影响。
3.PreRender过程
主要包括PreRender、PreRenderComplete事件。这时,所有控件数据绑定和界面配置都已经完成,控件已经准备好将数据呈现到即将发出的HTTP响应中,并且编程者可以决定每个变量的最终值。
4.Unload过程
页面已经完成了整个呈现过程,并且这个页面对象将被销毁。这时编程者不能与输出HTTP响应进行交互,但是可以进行其他的清除工作。
说明:所有的Page类型的事件都与System.EventHandler委托类型配合工作。
为了更形象地说明页面生命周期,在VS 2008中添加新的WEB窗体到NetWeb项目,并命名为Index.aspx,在Index.aspx页面添加服务器控件标签如以下代码所示。
<asp:Label runat="server" ID="MyLb" Text="MyLb控件初始文字" />
然后编写Index.aspx对应的代码页Index.aspx.cs如代码11.1所示。代码11.1  Index.aspx页面的代码文件:Index.aspx.cs
using System;
……………………………
namespace NetWeb
{
    public partial class Index : System.Web.UI.Page
    {
        public Index()
        {
            //由于控件未初始化,以下代码无法正确运行
            //this.MyLb.Text += "<hr />Index()方法所添加文本";
        }
        protected void Page_PreInit(object sender, EventArgs e)
        {
            //读取MyLb控件的Text属性值,并赋值给当前页面类的Title属性
            this.Title=this.MyLb.Text;
            this.MyLb.Text += "<hr />PreInit事件处理方法所添加文本";
        }
        protected void Page_Init(object sender, EventArgs e)
        {
            this.MyLb.Text += "<hr />Init事件处理方法所添加文本";
        }
        protected void Page_InitComplete(object sender, EventArgs e)
        {
            this.MyLb.Text += "<hr />InitComplete事件处理方法所添加文本";
        }
        protected void Page_PreLoad(object sender, EventArgs e)
        {
            this.MyLb.Text += "<hr />PreLoad事件处理方法所添加文本";
        }
        protected void Page_Load(object sender, EventArgs e)
        {
            this.MyLb.Text += "<hr />Load事件处理方法所添加文本";
        }
        protected void Page_PreRender(object sender, EventArgs e)
        {
            this.MyLb.Text += "<hr />PreRender事件处理方法所添加文本";
        }
        protected void Page_PreRenderComplete(object sender, EventArgs e)
        {
            this.MyLb.Text += "<hr />PreRenderComplete事件处理方法所添加文本";
        }
        protected void Page_Unload(object sender, EventArgs e)
        {
            //以下代码将在页面声明周期结束时,跳转到Default.aspx页面
            //Server.Transfer("Default.aspx");
            //以下代码将会报错,因为这时不能操作输出HTTP响应
            //Response.Redirect("Default.aspx");
        }
    }
}
打开IE浏览器,在浏览器地址栏输入“http://localhost/Default.aspx”,页面运行效果如图11.1所示。图11.1  Index.aspx页面浏览效果
通过这个例子,读者可以很直观地理解在ASP.NET中的页面生命周期。由于VS 2008等IDE创建*.cs页面类时自动添加了Page_Load事件处理方法的声明,导致很多初学者以为这是页面生命周期的开始,本例可消除对这种看法的误解。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ASP.NET WebForms是一种使用ASP.NET技术开发的Web应用程序框架,而WebJane Shop项目则是一个基于ASP.NET WebForms的在线商店项目。以下是对WebJane Shop项目代码的简要说明: WebJane Shop项目的代码主要分为前端代码和后端代码。 前端代码主要包括ASP.NET WebForms的页面文件(.aspx)和用户界面相关的脚本文件(.js)、样式文件(.css),以及相关的图片和其他多媒体资源。 后端代码主要包括ASP.NET WebForms的代码文件(.aspx.cs),其中包含了用于处理页面事件、与数据库交互和业务逻辑的C#代码。后端代码还包括与数据库相关的配置文件和类文件,用于连接数据库、执行SQL查询和更新操作。 在WebJane Shop项目中,前端代码的主要功能是实现用户界面的展示和用户交互,通过HTML和CSS来实现页面的布局和样式,通过JavaScript来实现一些交互效果,如表单验证、动态内容更新等。 后端代码的主要功能是处理用户请求,与数据库进行交互,并返回相应的结果。例如,通过后端代码可以实现用户注册、登录、浏览商品、添加商品到购物车、提交订单等功能。后端代码还可以对用户提交的表单数据进行验证和处理,将数据存储到数据库中或从数据库中读取数据并返回给前端页面。 总的来说,WebJane Shop项目的代码主要包括前端代码和后端代码,前端代码负责用户界面的展示和交互,后端代码负责处理用户请求、与数据库交互和业务逻辑。通过这些代码,用户可以在网页上实现在线购物的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值