在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
介绍 当一个页面请求被发送到WEB服务器,不论该事件是由页面提交还是由页面重定向而激发的,页面在其被创建到释放的过程中都会运行一系列的 事件。当我们创建ASP.NET页的时候往往没有关注它的执行周期,从而让我们碰到很多让自己头疼的问题。但是,如果被正确的使用和操纵,页 生命周期会成为一个高效且强大的工具。很多开发者都认识到,理解页面执行过程中发生了什么和什么时候发生对高效编写ASP.NET页和用户控 件是十分关键的。那么,让我们来详细的了解一个ASP.NET页面从被创建到其被释放的过程中的十个事件。币擦私庠跹颜庑┦录擞玫轿颐 堑淖远ㄒ宕胫小?lt;BR>我将把这个过程建立在一个用C#编写的ASP.NET简单提交页上。这个页面首次会加载一些服务器端WEB控件,当WEB服 务器接收到它的请求时,WEB服务器就会处理我们的WEB控件并最终让我们得到该页的HTML呈现。处理页面的第一步是对象初始化。
道对象的类型,并知道需要创建多少个这样的对象。一旦你在构造器中声明了你的控件,你就可以在它的任何子类,方法,事件或者属性中访 问到它们。但是,如果你的任何对象是在ASPX文件中指定的控件,这样的控件是没有属性的。而且这样做对从代码中访问它们是危险的,因为 无法保证这些控件实例是按照怎样的顺序被创建的(假定它们都是能完全被创建的)。初始化事件可以通过OnInit方法重载。 2.加载视图状态数据 上一次提交存留到服务器的视图状态信息。页视图状态通过ASP.NET维护,它被用于在一个往返行程中存留信息到服务器。视图状态信息被保存 为一个名称/值对,它包含控件的如Text和Value一类的信息。视图信息被保存在隐藏<input>控件的值属性中在页请求中传递。正如你所了解的 ,这是旧的ASP3.0状态维护技术的一个巨大飞跃。这个事件可以通过LoadViewState方法重载,往往用来在控件被填充时定制它所接受的数据。 图2显示了一个在LoadViewState事件中设置视图状态的重载例子。 3.LoadPostData处理回传数据 在每个提交数据的控件上实现IPostBackDataHandler接口。页面然后激发LoadPostData事件,通过页面解析发现实现了IPostBackDataHandler 接口的控件,并用正确的回传数据更新控件状态。ASP.NET通过匹配控件的唯一标示符来更新正确的控件,该标示符具有名称值集合中的名称值 对。这也就是在所有特定的页中每个控件都需要一个唯一标示符的原因之一。其它的步骤都由框架来完成,以确定每个标示符在环境中是唯一 的,例如存在于单页面中的自定义用户控件。LoadPostData事件被激发后,RaisePostDataChanged事件就可以随时被执行了(请继续往下看) 4.对象加载 the DOM)来引用。然后对象就可以自由的访问HTML中的客户端属性集,例如width,value,或者visibility。加载时,控件逻辑,如算法、以编 程方式设置控件属性、用StringBuilder装配输出字符串都同时被执行。大部分的工作都是在这一阶段完成的。Load 事件能够通过调用OnLoad 来重载,如图3。 5.激发RaisePostDataChanged 事件 识,标识其自上一次提交后该控件的数据是被更改还是保持原值。然后ASP.NET通过搜索页来寻找任何显示控件数据被更改的标识并激发 RaisePostDataChanged。RaisePostDataChanged事件直到Load事件发生后,所有控件被更新后才激发。这保证了在控件被回传数据更新前,其 它控件的数据在RaisePostDataChanged事件中没有被手动更改过。 6.处理客户端回传事件 改变而引发回传的控件(其autopostback被启用)或者是一个被点击的窗体提交按钮。很多代码都在这个事件中执行,因为这是控制事件驱动逻 辑的理想位置。为了保证呈现到浏览器的数据的正确性,在一系列的回传事件后RaisePostBackEvent事件最终被激发。基于一致性的考虑,回 传中改变的控件直到这个函数被执行后才被更新。也就是说,被预期事件改变的数据总是在结果页反映出来。RaisePostBackEvent事件可以通 过RaisePostBackEvent来捕捉 7.对象预呈现 改的理想位置,例如改变控件属性或改变控件树结构,不用担心因为数据库请求或者视图状态更新而导致对象的变化。预呈现阶段之后,对象 改变被锁定并且不能再被保存到页视图状态中。预呈现阶段可以通过重载OnPreRender实现。 8.保存视图状态 地方。在SaveViewState事件中,值能够被保存到视图状态对象中,但页面控件的改变并不能保存到其中。可以通过重载SaveViewState实现这 个步骤 9.呈现HTML Render事件被重载的时候,开发者可以为浏览器创建定制的HTML,此时页面创建的任何HTML都还没有生效。Render 方法用HtmlTextWriter对象 作参数并由它产生HTML给浏览器。这里仍然可以作修改,但是这样的修改只会反映到客户(译者注:意即改变只会在HTML呈现中反映而视图状态 并无法被改变)。Render 事件可以被重载 ,你可以安全的释放任何还存在的对象,包括Page对象。Dispose能被重载 具体对应的事件顺序如下: code: using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Collections.Specialized; namespace ControlLifecycel { /// <summary> /// ControlLifecycel /// Leo.wl /// 2010-05-24 /// </summary> [DefaultProperty("Text")] [ToolboxData("<{0}:ControlLifecycel runat=server></{0}:ControlLifecycel>")] public class ControlLifecycel : WebControl ,IPostBackDataHandler,IPostBackEventHandler { /// <summary> /// OnInit /// </summary> /// <param name="e"></param> protected override void OnInit(EventArgs e) { OutPut("1.OnInit."); base.OnInit(e); this.Page.RegisterRequiresPostBack(this); } /// <summary> /// LoadViewState /// </summary> /// <param name="savedState"></param> protected override void LoadViewState(object savedState) { OutPut("2.LoadViewState."); base.LoadViewState(savedState); } /// <summary> /// LoadPostData /// </summary> /// <param name="postDataKey"></param> /// <param name="postCollection"></param> /// <returns></returns> public virtual bool LoadPostData(string postDataKey ,NameValueCollection postCollection) { OutPut("3.LoadPostData."); return true; } /// <summary> /// OnLoad /// </summary> /// <param name="e"></param> protected override void OnLoad(EventArgs e) { OutPut("4.OnLoad."); base.OnLoad(e); } /// <summary> /// RaisePostDataChangedEvent /// </summary> public virtual void RaisePostDataChangedEvent() { OutPut("5. RaisePostDataChangedEvent."); } /// <summary> /// RaisePostBackEvent /// </summary> /// <param name="eventArgument"></param> public virtual void RaisePostBackEvent(string eventArgument) { OutPut("6.RaisePostBackEvent."); } /// <summary> /// OnPreRender. /// </summary> /// <param name="e"></param> protected override void OnPreRender(EventArgs e) { OutPut("7.OnPreRender."); base.OnPreRender(e); } /// <summary> /// SaveViewState /// </summary> /// <returns></returns> protected override object SaveViewState() { OutPut("8.SaveViewState."); base.SaveViewState(); return new Pair(); } /// <summary> /// Render /// </summary> /// <param name="writer"></param> protected override void Render(HtmlTextWriter writer) { writer.Write("<INPUT type=button name=\"{0}\" value=\"Click Me!\" style='position:absolute;left:20,top:280px' onclick=\"{1}\">","[控件的生命周期]",Page.ClientScript.GetPostBackEventReference(this,"")); OutPut("9,Render"); base.Render(writer); } /// <summary> /// OnUnload. /// </summary> /// <param name="e"></param> protected override void OnUnload(EventArgs e) { OutPut("10.OnUnload."); base.OnUnload(e); } /// <summary> /// Dispose /// </summary> public override void Dispose() { OutPut("11.Dispose."); base.Dispose(); } /// <summary> /// OutPut /// </summary> /// <param name="strText"></param> private void OutPut(string strText) { if (!this.DesignMode) { HttpContext.Current.Response.Write(strText + "<br>"); } } } } Demo:
候就会更加容易和高效(更不用提会碰到更少的让我们灰心的事)。以上就是Asp.net页面生命周期中的十个事件。每次我们请求一个Asp.net页面时,我们都经历着同样的过程:从初始化对象到销毁对象。通过了解Asp.net页面的内部运行机制,我相信大家在编写、调试代码的时候会更加游刃有余的。
|
请发表评论