ASP.NET組件設(shè)計(jì)之生命周期詳解
ASP.NET組件設(shè)計(jì)之生命周期是什么呢?讓我們來(lái)看看:
當(dāng)一個(gè)ASP.NET頁(yè)面被請(qǐng)求后,一個(gè)page實(shí)例被生成,開(kāi)始自己的邏輯,最終返回HTML流給用戶(hù)端。構(gòu)成邏輯處理的是page中存在的服務(wù)器端控件以及控件間的交互,并且在頁(yè)面結(jié)束前服務(wù)器控件們被銷(xiāo)毀(視.net的回收策略而定)。那么這些控件在短短的頁(yè)面處理過(guò)程中經(jīng)歷了創(chuàng)建、處理、銷(xiāo)毀等到底是如何組織的?這些控件是如何同其他控件交互,如何在多個(gè)頁(yè)面間保持狀態(tài)的?(這應(yīng)當(dāng)是整個(gè)控件開(kāi)發(fā)的基本也是重要的知識(shí))
首先,我們看看特殊的控件,也就是Page類(lèi),所有aspx頁(yè)面的父類(lèi)(或者祖先)。因?yàn)檫@是我們程序員主要的舞臺(tái)。Page類(lèi)繼承自TemplateControl, 且實(shí)現(xiàn)了IhttpHandler。IhttpHandler接口是保證頁(yè)面被ASP.NET框架所調(diào)度,并且可以獲得HTTP協(xié)議的數(shù)據(jù)輸入流以及獲得向HTTP輸出流輸出數(shù)據(jù)的能力;而TemplateControl類(lèi)是繼承自Control類(lèi)。Page實(shí)現(xiàn)了InamingContainer接口,這保證了他可以充當(dāng)頁(yè)面中的控件們的容器(控件們的戰(zhàn)斗舞臺(tái))
好了,現(xiàn)在看看在ASP.NET組件設(shè)計(jì)中的ASP.NET控件生命周期(看看MS是如何定義這個(gè)框架體系的):
1、 Instance 實(shí)例化
通過(guò)控件的構(gòu)造器所實(shí)例化。還可以通過(guò)被父控件實(shí)例化而生成。
2、 Initialize 初始化
控件會(huì)通過(guò)默認(rèn)方式調(diào)用OnInit方法,從而引發(fā)On_init事件。Page根據(jù)aspx頁(yè)面的語(yǔ)法以及標(biāo)簽設(shè)定值來(lái)初始化控件,對(duì)聲明語(yǔ)法中的控件及其屬性賦值。作為一個(gè)特殊控件,一般可以在Page的OnInit事件中允許編程者提供控間的初始化操作(對(duì)某些屬性賦值)。對(duì)于控件包含的子控件,控件可以訪問(wèn)他們,但是子控件是不可以訪問(wèn)父控件的(因?yàn)榭丶藭r(shí)還沒(méi)有被加載(Load))。
3、 Begin Tracking View State 開(kāi)始跟蹤視圖狀態(tài)
發(fā)生在初始化階段末尾,Page會(huì)調(diào)用控件的TrackViewState方法(這是一個(gè)繼承自Control的保護(hù)方法)
4、 Load View State 加載視圖
此時(shí),頁(yè)面框架自動(dòng)恢復(fù)了ViewState字典(ViewState數(shù)據(jù)來(lái)自表單form中的隱含字段),控件會(huì)根據(jù)ViewState值來(lái)設(shè)定自己的屬性或者內(nèi)部字段變量等
5、 Load PostBack Data加載回傳數(shù)據(jù)
如果控件實(shí)現(xiàn)了IpostBackDataHandle接口,那么頁(yè)面回調(diào)用控件實(shí)現(xiàn)的接口,讓其參與對(duì)回傳數(shù)據(jù)的處理
6、 Load 加載
此時(shí),控件樹(shù)(page的控件以及控件的子控件構(gòu)成的樹(shù))所有控件都已經(jīng)被初始化,并恢復(fù)到上一個(gè)周期的狀態(tài)(這是通過(guò)ViewState獲得的),可以訪問(wèn)其他的任何控件。
7、 Raise Change Events引發(fā)修改(控件的)事件
處理回傳的數(shù)據(jù),此時(shí)可能會(huì)引起控件的某些事件作為對(duì)某些屬性被修改的通知。
8、 Raise Postback Event 引發(fā)回傳數(shù)據(jù)
當(dāng)發(fā)生修改事件時(shí)候,引發(fā)將客戶(hù)端發(fā)生的一些事件映射到服務(wù)器控件的事件,從而調(diào)用控件的事件的處理例程。這大多是控件開(kāi)發(fā)者的客戶(hù)—另外一些程序員重用控件時(shí)的舞臺(tái)。
9、 PreRender 預(yù)生成
通過(guò)調(diào)用控件的OnPreRender方法,執(zhí)行在生成控件前的所需任何工作。遞歸調(diào)用子控件的此方法。
10、Save View State 保存視圖狀態(tài)
控件繼承Control的方法來(lái)保存當(dāng)前控件狀態(tài)到ViewState中去
11、Render 生成
控件輸出HTML數(shù)據(jù)到HTML流中去。
12、Unload 卸載
頁(yè)面通過(guò)實(shí)現(xiàn)Page_Onload方法執(zhí)行清除工作,也默認(rèn)引發(fā)控件的Unload事件
13、Dispose釋放
此時(shí),控件執(zhí)行清除占用資源的方法。
以上討論適宜于在aspx頁(yè)面中聲明創(chuàng)建的控件,如果是在頁(yè)面/控件的事件處理程序中創(chuàng)造得控件,則在控件加入到控件樹(shù)開(kāi)始執(zhí)行各個(gè)階段,直到達(dá)到頁(yè)面的當(dāng)前階段,之后,該動(dòng)態(tài)創(chuàng)建的控件將隨同頁(yè)面其他控件一樣工作。
ASP.NET組件設(shè)計(jì)中的ASP.NET控件生命周期就向你介紹到這里,希望對(duì)你在ASP.NET組件設(shè)計(jì)的學(xué)習(xí)中ASP.NET控件生命周期的了解有自己的認(rèn)識(shí)。
【編輯推薦】