淺談ASP.NET內部機制(五)
前言:本章要談頁面生命週期了,過程挺多的,但是一點都不難。不信可以看看。我盡量的講的平實一些,而且理解頁面的生命週期對喜歡開發自訂控制項和組件的朋友是很有協助的。
系列文章連結:
淺談ASP.NET的內部機制(一)
淺談ASP.NET的內部機制(二)
淺談ASP.NET內部機制(三)
淺談ASP.NET內部機制(四)
淺談ASP.NET內部機制(五)
淺談ASP.NET內部機制(六)
淺談ASP.NET內部機制(七)
淺談ASP.NET內部機制(八)
頁面生命週期,也就是處理一個頁面請求的過程。我們之前就說過了的,不同檔案的由不同的處理常式來處理。而且處理常式都是實現了IHttpHandler介面。這個介面中有兩個方法,其中真正用來處理請求的就是ProcessRequest方法。
所以當我們請求一個頁面的時候,我們的頁面,假如我們請求的是default.aspx這個頁面是繼承自Page,大家應該知道在程式啟動並執行時候default.aspx以及它的.cs代碼部分一起被編譯成為default_aspx ,如下:
Code
using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
namespace ASP
{
public class default_aspx : Page
{
protected ScriptManager ScriptManager1;
protected TextBox TextBox1;
protected Button Button1;
protected Label Info;
protected UpdatePanel UpdatePanel1;
protected HtmlForm form1;
private UpdatePanel @__BuildControlUpdatePanel1()
{
. . .
}
private HtmlForm @__BuildControlform1()
{
. . .
}
private void @__BuildControlTree(default_aspx @__ctrl)
{
IParserAccessor @__parser = ((IParserAccessor) (@__ctrl));
@__parser.AddParsedSubObject(
new LiteralControl(“<html xmlns=\”http://www.w3.org/1999/xhtml\”>”));
@__parser.AddParsedSubObject(new LiteralControl(“\r\n<body>\r\n “));
HtmlForm @__ctrl2 = this.@__BuildControlform1();
@__parser.AddParsedSubObject(@__ctrl2);
@__parser.AddParsedSubObject(
new LiteralControl(“\r\n</body>\r\n</html>\r\n”));
}
protected override void FrameworkInitialize()
{
base.FrameworkInitialize();
this.@__BuildControlTree(this);
}
}
}
因為我們的請求是請求的上面的那個default.aspx頁面,也就是說我們請求的檔案是以.aspx結尾的。而恰好以.aspx檔案結果的處理常式是由Page來處理的,因為Page類實現了IHttpHandler.所以就是這裡比較特殊,很多人都在這裡糊塗過。因為default_aspx繼承Page,所以請求defult.aspx的請求實際上是由default_aspx類的執行個體來處理的。這裡講點的有點繞,大家見諒。講的更加通俗點基本上可以這麼認為“自己處理自己”(這個說法很不嚴格,只是希望大家加深理解)。
其實處理的過程就是所謂的頁面生命週期,說白了也就是處理的流程,大家看看下面Page類的ProcessRequest方法就知道了:(大家只要隨便掃一下下面的代碼就行了)
Code
public void ProcessRequest(HttpContext context)
{
this._context = context;
this.RetrievePostedData();
if (this.MaintainScrollPositionOnPostBack)
this.LoadScrollPosition();
this.PerformPreInit();
this.InitRecursive(null);
this.OnInitComplete(EventArgs.Empty);
if (this.IsPostBack)
{
this.LoadAllState();
this.ProcessPostData(this._requestValueCollection, true);
}
this.OnPreLoad(EventArgs.Empty);
this.LoadRecursive();
if (this.IsPostBack)
{
this.ProcessPostData(this._leftoverPostData, false);
this.RaiseChangedEvents();
this.RaisePostBackEvent this._requestValueCollection);
}
this.OnLoadComplete(EventArgs.Empty);
this.PreRenderRecursive();
this.PerformPreRenderComplete();
this.SaveAllState();
this.OnSaveStateComplete(EventArgs.Empty);
this.RenderControl(this.CreateHtmlTextWriter (this.Response.Output));
}
上面的代碼,是不是有我們很熟悉的部分,如Init事件的觸發方法,Load事件的觸發方法(都是以On開發的方法)。相信大家應該明白了,其實頁面的生命週期就是一個個方法的調用過程。
下面就是方法執行的圖解:
大家可以對照方法從上往下看,因為很多的文章都已經詳細的介紹了每個方法的作用,我這裡不再贅述,如果大家需要的話就說下.
今天到這裡。謝謝!