免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
ASP.NET頁(yè)面的生命周期
當(dāng)一個(gè)頁(yè)面請(qǐng)求被發(fā)送到WEB服務(wù)器,不論該事件是由頁(yè)面提交還是由頁(yè)面重定向而激發(fā)的,頁(yè)面在其被創(chuàng)建到釋放的過(guò)程中都會(huì)運(yùn)行一系列的事件。當(dāng)我們創(chuàng)建ASP.NET頁(yè)的時(shí)候往往沒(méi)有關(guān)注它的執(zhí)行周期,從而讓我們碰到很多讓自己頭疼的問(wèn)題。但是,如果被正確的使用和操縱,頁(yè)生命周期會(huì)成為一個(gè)高效且強(qiáng)大的工具。很多開(kāi)發(fā)者都認(rèn)識(shí)到,理解頁(yè)面執(zhí)行過(guò)程中發(fā)生了什么和什么時(shí)候發(fā)生對(duì)高效編寫(xiě)ASP.NET頁(yè)和用戶(hù)控件是十分關(guān)鍵的。那么,讓我們來(lái)詳細(xì)的了解一個(gè)ASP.NET頁(yè)面從被創(chuàng)建到其被釋放的過(guò)程中的十個(gè)事件。我將把這個(gè)過(guò)程建立在一個(gè)用C#編寫(xiě)的ASP.NET簡(jiǎn)單提交頁(yè)上。這個(gè)頁(yè)面首次會(huì)加載一些服務(wù)器端WEB控件,當(dāng)WEB服務(wù)器接收到它的請(qǐng)求時(shí),WEB服務(wù)器就會(huì)處理我們的WEB控件并最終讓我們得到該頁(yè)的HTML呈現(xiàn)。處理頁(yè)面的第一步是對(duì)象初始化。


1.對(duì)象初始化
頁(yè)面中的控件(包括頁(yè)面本身)都是在它們最初的FORM中被首次初始化的。通過(guò)在ASPX頁(yè)面的后臺(tái)代碼文件的構(gòu)造器中聲明你的對(duì)象,頁(yè)面將知道對(duì)象的類(lèi)型,并知道需要?jiǎng)?chuàng)建多少個(gè)這樣的對(duì)象。一旦你在構(gòu)造器中聲明了你的控件,你就可以在它的任何子類(lèi),方法,事件或者屬性中訪(fǎng)問(wèn)到它們。但是,如果你的任何對(duì)象是在ASPX文件中指定的控件,這樣的控件是沒(méi)有屬性的。而且這樣做對(duì)從代碼中訪(fǎng)問(wèn)它們是危險(xiǎn)的,因?yàn)闊o(wú)法保證這些控件實(shí)例是按照怎樣的順序被創(chuàng)建的(假定它們都是能完全被創(chuàng)建的)。初始化事件可以通過(guò)OnInit方法重載。


2.加載視圖狀態(tài)數(shù)據(jù)
初始化以后,控件僅能通過(guò)ID引用(還沒(méi)有建立用于相對(duì)引用的文檔對(duì)象模型)。在LoadViewState事件中,已初始化的控件獲得第一個(gè)屬性:上一次提交存留到服務(wù)器的視圖狀態(tài)信息。頁(yè)視圖狀態(tài)通過(guò)ASP.NET維護(hù),它被用于在一個(gè)往返行程中存留信息到服務(wù)器。視圖狀態(tài)信息被保存為一個(gè)名稱(chēng)/值對(duì),它包含控件的如Text和Value一類(lèi)的信息。視圖信息被保存在隱藏<input>控件的值屬性中在頁(yè)請(qǐng)求中傳遞。正如你所了解的,這是舊的ASP3.0狀態(tài)維護(hù)技術(shù)的一個(gè)巨大飛躍。這個(gè)事件可以通過(guò)LoadViewState方法重載,往往用來(lái)在控件被填充時(shí)定制它所接受的數(shù)據(jù)。


3.LoadPostData處理回傳數(shù)據(jù)
在創(chuàng)建頁(yè)的階段,被發(fā)送到服務(wù)器端的Form數(shù)據(jù)(ASP.NET中的術(shù)語(yǔ)為回傳數(shù)據(jù))依照每個(gè)控件的數(shù)據(jù)需求進(jìn)行處理。當(dāng)頁(yè)面提交Form時(shí),框架將在每個(gè)提交數(shù)據(jù)的控件上實(shí)現(xiàn)IPostBackDataHandler接口。頁(yè)面然后激發(fā)LoadPostData事件,通過(guò)頁(yè)面解析發(fā)現(xiàn)實(shí)現(xiàn)了IPostBackDataHandler 接口的控件,并用正確的回傳數(shù)據(jù)更新控件狀態(tài)。ASP.NET通過(guò)匹配控件的唯一標(biāo)示符來(lái)更新正確的控件,該標(biāo)示符具有名稱(chēng)值集合中的名稱(chēng)值對(duì)。這也就是在所有特定的頁(yè)中每個(gè)控件都需要一個(gè)唯一標(biāo)示符的原因之一。其它的步驟都由框架來(lái)完成,以確定每個(gè)標(biāo)示符在環(huán)境中是唯一的,例如存在于單頁(yè)面中的自定義用戶(hù)控件。LoadPostData事件被激發(fā)后,RaisePostDataChanged事件就可以隨時(shí)被執(zhí)行了。

4.對(duì)象加載
對(duì)象在Load事件中獲得正確的Form。所有的對(duì)象首先都被組織在頁(yè)DOM(ASP.NET中稱(chēng)為控件樹(shù))中,并且很容易通過(guò)代碼或者相對(duì)位置(crawling the DOM)來(lái)引用。然后對(duì)象就可以自由的訪(fǎng)問(wèn)HTML中的客戶(hù)端屬性集,例如width,value,或者visibility。加載時(shí),控件邏輯,如算法、以編程方式設(shè)置控件屬性、用StringBuilder裝配輸出字符串都同時(shí)被執(zhí)行。大部分的工作都是在這一階段完成的。Load 事件能夠通過(guò)調(diào)用OnLoad來(lái)重載。

5.激發(fā)RaisePostDataChanged事件
如前所述,這發(fā)生在所有實(shí)現(xiàn)了IPostBackDataHandler接口的控件被正確的回傳數(shù)據(jù)更新以后。在這個(gè)過(guò)程中,每個(gè)控件都有一個(gè)布爾值的標(biāo)識(shí),標(biāo)識(shí)其自上一次提交后該控件的數(shù)據(jù)是被更改還是保持原值。然后ASP.NET通過(guò)搜索頁(yè)來(lái)尋找任何顯示控件數(shù)據(jù)被更改的標(biāo)識(shí)并激發(fā)
RaisePostDataChanged。RaisePostDataChanged事件直到Load事件發(fā)生后,所有控件被更新后才激發(fā)。這保證了在控件被回傳數(shù)據(jù)更新前,其它控件的數(shù)據(jù)在RaisePostDataChanged事件中沒(méi)有被手動(dòng)更改過(guò)。

6.處理客戶(hù)端回傳事件
當(dāng)回傳更新導(dǎo)致數(shù)據(jù)改變而引發(fā)服務(wù)器端事件后,引發(fā)回傳的對(duì)象會(huì)在RaisePostBackEvent事件中被處理。這種激發(fā)回傳的對(duì)象往往是其狀態(tài)改變而引發(fā)回傳的控件(其autopostback被啟用)或者是一個(gè)被點(diǎn)擊的窗體提交按鈕。很多代碼都在這個(gè)事件中執(zhí)行,因?yàn)檫@是控制事件驅(qū)動(dòng)邏輯的理想位置。為了保證呈現(xiàn)到瀏覽器的數(shù)據(jù)的正確性,在一系列的回傳事件后RaisePostBackEvent事件最終被激發(fā)。基于一致性的考慮,回傳中改變的控件直到這個(gè)函數(shù)被執(zhí)行后才被更新。也就是說(shuō),被預(yù)期事件改變的數(shù)據(jù)總是在結(jié)果頁(yè)反映出來(lái)。RaisePostBackEvent事件可以通過(guò)RaisePostBackEvent來(lái)捕捉。

7.對(duì)象預(yù)呈現(xiàn)
對(duì)象被預(yù)呈現(xiàn)的地方對(duì)于那些能夠保存到視圖或者維持其視圖狀態(tài)的對(duì)象來(lái)說(shuō)是最后一次有機(jī)會(huì)改變的地方。這使得預(yù)呈現(xiàn)步驟成為做最后修改的理想位置,例如改變控件屬性或改變控件樹(shù)結(jié)構(gòu),不用擔(dān)心因?yàn)閿?shù)據(jù)庫(kù)請(qǐng)求或者視圖狀態(tài)更新而導(dǎo)致對(duì)象的變化。預(yù)呈現(xiàn)階段之后,對(duì)象改變被鎖定并且不能再被保存到頁(yè)視圖狀態(tài)中。預(yù)呈現(xiàn)階段可以通過(guò)重載OnPreRender實(shí)現(xiàn)。

8.保存視圖狀態(tài)
只有在所有的頁(yè)面對(duì)象的改變都發(fā)生后視圖狀態(tài)才被保存。對(duì)象狀態(tài)數(shù)據(jù)被保存在隱藏<input>對(duì)象中,這也是對(duì)象狀態(tài)數(shù)據(jù)準(zhǔn)備呈現(xiàn)到HTML的地方。在SaveViewState事件中,值能夠被保存到視圖狀態(tài)對(duì)象中,但頁(yè)面控件的改變并不能保存到其中??梢酝ㄟ^(guò)重載SaveViewState實(shí)現(xiàn)這個(gè)步驟。

9.呈現(xiàn)HTML
Render事件通過(guò)裝配用于瀏覽器輸出的HTML來(lái)著手頁(yè)的創(chuàng)建。在Render事件中,頁(yè)調(diào)用對(duì)象使它們呈現(xiàn)為HTML,然后頁(yè)收集HTML來(lái)發(fā)送。當(dāng)Render事件被重載的時(shí)候,開(kāi)發(fā)者可以為瀏覽器創(chuàng)建定制的HTML,此時(shí)頁(yè)面創(chuàng)建的任何HTML都還沒(méi)有生效。Render 方法用HtmlTextWriter對(duì)象作參數(shù)并由它產(chǎn)生HTML給瀏覽器。這里仍然可以作修改,但是這樣的修改只會(huì)反映到客戶(hù)(譯者注:意即改變只會(huì)在HTML呈現(xiàn)中反映而視圖狀態(tài)并無(wú)法被改變)。Render 事件可以被重載

10.釋放
當(dāng)頁(yè)面的HTML呈現(xiàn)后,對(duì)象被釋放。在Dispose事件中,你可以清除任何在頁(yè)面創(chuàng)建中構(gòu)造的對(duì)象或者引用。在這里,所有的處理都已經(jīng)被執(zhí)行,你可以安全的釋放任何還存在的對(duì)象,包括Page對(duì)象。

 

Dispose能被重載具體對(duì)應(yīng)的事件順序如下:
Page_Init()
LoadViewState
LoadPostData
Page_Load()
RaisePostDataChanged
RaisePostBackEvent
Page_PreRender()
SaveViewState
Page_Render()
UnLoad

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶(hù)發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
asp.net頁(yè)面的生存周期
ASP.NET頁(yè)面執(zhí)行順序
ASP.NET頁(yè)面生命周期和asp.net應(yīng)用程序生命周期 - 海里的貝殼的日志 - 網(wǎng)易...
Asp.net2.0頁(yè)面執(zhí)行順序
獲取部分視圖(子控制器)的model值
ASP.NET頁(yè)面——視圖狀態(tài)
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服