asp.net的出現,打破了這種傳統;asp.net采用了codebehind技術和服務器端控件,加入了服務器端的事件的概念,改變了腳本語言編寫的模式,更加貼近window編程,使web編程更加簡單、直觀;但是我們要看到,asp.net本身并沒有改變web編程的基本模式,只是封裝了一些細節、提供了一些易用的功能,使代碼更容易編寫和維護;從某種程度上來說,將服務器端執行的方式復雜化了,這就是我們今天要討論的主體:asp.net web page的生存周期。
這個問題實際上并不復雜,各位使用asp.net編程的朋友可以到你們的系統盤:/windows/microsoft.net/framework/<版本號>/temporary asp.net files這個目錄下,這個下面就放了所有本機上存在的asp.net應用程序的臨時文件,子目錄的名稱就是應用程序的名稱,然后再下去兩層(為了保證唯一,asp.net自動產生了兩層子目錄,并且子目錄名稱是隨機的),然后我們會發現有很多類似:“yfy1gjhc.dll”、“xeunj5u3.dll”這樣的鏈接庫以及“komee-bp.0.cs”、“9falckav.0.cs”這樣的源文件,實際上這就是aspx被asp.net動態編譯后的結果,打開這些源文件我們可以發現:
public class webform_aspx : mynamespace.webform, system.web.sessionstate.irequiressessionstate 這就印證了我們前面的說法,aspx是代碼綁定類的子類,它的名稱是aspx文件名加上“_aspx”后綴,通過研究這些代碼我們可以發現,實際上所有aspx中定義的服務器控件都是在這些代碼中生成的,然后動態產生這些代碼的時候,把原來在aspx中嵌入的代碼寫在了相應的位置。
“每次請求 asp.net 頁時,服務器就會加載一個 asp.net 頁,并在請求完成時卸載該頁。頁及其包含的服務器控件負責執行請求并將 html 呈現給客戶端。雖然客戶端和服務器之間的通訊是無狀態的和斷續的,但是必須使客戶感覺到這是一個連續執行的過程。”
“這種連續性假象是由 asp.net 頁框架、頁及其控件實現的。回發后,控件的行為必須看起來是從上次 web 請求結束的地方開始的。雖然 asp.net 頁框架可使執行狀態管理相對容易一些,但是為了獲得連續性效果,控件開發人員必須知道控件的執行順序。控件開發人員需要了解:在控件生命周期的各個階段,控件可使用哪些信息、保持哪些數據、控件呈現時處于哪種狀態。例如,在填充頁上的控件樹之前控件不能調用其父級。” “下表提供了控件生命周期中各階段的高級概述。有關詳細信息,請點擊表中的鏈接。”