主頁(yè) > 知識(shí)庫(kù) > ASP.NET Web頁(yè)生命周期和執(zhí)行的方法介紹

ASP.NET Web頁(yè)生命周期和執(zhí)行的方法介紹

熱門(mén)標(biāo)簽:蘇州銷(xiāo)售外呼系統(tǒng)預(yù)算 外呼系統(tǒng)用員工身份證 使用智能電話(huà)機(jī)器人違法嗎 東莞語(yǔ)音電銷(xiāo)機(jī)器人排名 保山電話(huà)外呼管理系統(tǒng)怎么用 朝陽(yáng)市地圖標(biāo)注 太原外呼電銷(xiāo)機(jī)器人費(fèi)用 淘寶地圖標(biāo)注如何做 電話(huà)機(jī)器人廣告話(huà)術(shù)

以上所列的階段中有些在頁(yè)面級(jí)是不可見(jiàn)的,并且僅對(duì)服務(wù)器控件的編寫(xiě)者和要?jiǎng)?chuàng)建從 Page 導(dǎo)出的類(lèi)的開(kāi)發(fā)人員有意義。Init、Load、PreRender、Unload,再加上由嵌入式控件定義的所有回發(fā)事件,就構(gòu)成了向外發(fā)送頁(yè)面的各個(gè)階段標(biāo)記。

執(zhí)行的各個(gè)階段

頁(yè)面生命周期中的第一個(gè)階段是初始化。這個(gè)階段的標(biāo)志是 Init 事件。在成功創(chuàng)建頁(yè)面的控件樹(shù)后,將對(duì)應(yīng)用程序觸發(fā)此事件。換句話(huà)說(shuō),當(dāng) Init 事件發(fā)生時(shí),.aspx 源文件中靜態(tài)聲明的所有控件都已實(shí)例化并采用各自的默認(rèn)值??丶梢越厝?Init 事件以初始化在傳入的 Web 請(qǐng)求的生命周期內(nèi)所需的所有設(shè)置。例如,這時(shí)控件可以加載外部模板文件或設(shè)置事件的處理程序。請(qǐng)注意,這時(shí)視圖狀態(tài)信息尚不可用。

初始化之后,頁(yè)面框架將加載頁(yè)面的視圖狀態(tài)。視圖狀態(tài)是名稱(chēng)/值對(duì)的集合,在此集合中,控件和頁(yè)面本身存儲(chǔ)了對(duì)所有 Web 請(qǐng)求都必須始終有效的全部信息。視圖狀態(tài)代表了頁(yè)面的調(diào)用上下文。通常,它包含上次在服務(wù)器上處理頁(yè)面時(shí)控件的狀態(tài)。首次在會(huì)話(huà)中請(qǐng)求頁(yè)面時(shí),視圖狀態(tài)為空。默認(rèn)情況下,視圖狀態(tài)存儲(chǔ)在靜默添加到頁(yè)面的隱藏字段中,該字段的名稱(chēng)是 __VIEWSTATE。通過(guò)覆蓋 LoadViewState 方法(Control 類(lèi)的受保護(hù)、可覆蓋方法),組件開(kāi)發(fā)人員可以控制視圖狀態(tài)的存儲(chǔ)方式以及視圖狀態(tài)的內(nèi)容映射到內(nèi)部狀態(tài)的方式。

有些方法(如 LoadPageStateFromPersistenceMedium 以及其對(duì)應(yīng)的 SavePageStateToPersistenceMedium),可以用來(lái)將視圖狀態(tài)加載并保存到其他存儲(chǔ)介質(zhì)(例如會(huì)話(huà)、數(shù)據(jù)庫(kù)或服務(wù)器端文件)中。與 LoadViewState 不同,上述方法只能在從 Page 導(dǎo)出的類(lèi)中使用。

存儲(chǔ)視圖狀態(tài)之后,頁(yè)面樹(shù)中控件的狀態(tài)與頁(yè)面最后一次顯示在瀏覽器中的狀態(tài)相同。下一步是更新它們的狀態(tài)以加入客戶(hù)端的更改。處理回發(fā)數(shù)據(jù)階段使控件有機(jī)會(huì)更新其狀態(tài),從而準(zhǔn)確反映客戶(hù)端相應(yīng)的 HTML 元素的狀態(tài)。例如,服務(wù)器的 TextBox 控件對(duì)應(yīng)的 HTML 元素是 input type=text>。在回發(fā)數(shù)據(jù)階段,TextBox 控件將檢索 input> 標(biāo)記的當(dāng)前值,并使用該值來(lái)刷新自己內(nèi)部的狀態(tài)。每個(gè)控件都要從回發(fā)的數(shù)據(jù)中提取值并更新自己的部分屬性。TextBox 控件將更新它的 Text 屬性,而 CheckBox 控件將刷新它的 Checked 屬性。服務(wù)器控件和 HTML 元素的對(duì)應(yīng)關(guān)系可以通過(guò)二者的 ID 找到。

在處理回發(fā)數(shù)據(jù)階段的最后,頁(yè)面中的所有控件的狀態(tài)都將使用客戶(hù)端輸入的更改來(lái)更新前一狀態(tài)。這時(shí),將對(duì)頁(yè)面觸發(fā) Load 事件。

頁(yè)面中可能會(huì)有一些控件,當(dāng)其某個(gè)敏感屬性在兩個(gè)不同的請(qǐng)求中被修改時(shí),需要完成特定的任務(wù)。例如,如果 TextBox 控件的文本在客戶(hù)端被修改,則此控件將觸發(fā) TextChanged 事件。每個(gè)控件在其一個(gè)或多個(gè)屬性被修改為客戶(hù)端輸入的值時(shí)都可以決定觸發(fā)相應(yīng)的事件。對(duì)于這些更改對(duì)其非常關(guān)鍵的控件,控件實(shí)現(xiàn) IPostBackDataHandler 接口,此接口的 LoadPostData 方法是在 Load 事件后立即調(diào)用的。通過(guò)對(duì) LoadPostData 方法進(jìn)行編碼,控件將驗(yàn)證自上次請(qǐng)求后是否發(fā)生了關(guān)鍵更改,并觸發(fā)自己的更改事件。

頁(yè)面生命周期中的關(guān)鍵事件是被調(diào)用以執(zhí)行服務(wù)器端代碼的事件,此代碼與客戶(hù)端觸發(fā)的事件相關(guān)聯(lián)。當(dāng)用戶(hù)單擊按鈕時(shí),將回發(fā)頁(yè)面?;匕l(fā)值的集合中包括啟動(dòng)整個(gè)操作的按鈕的 ID。如果控件實(shí)現(xiàn) IPostBackEventHandler 接口(如按鈕和鏈接按鈕),頁(yè)面框架將調(diào)用 RaisePostBackEvent 方法。此方法的行為取決于控件的類(lèi)型。就按鈕和鏈接按鈕而言,此方法將查找 Click 事件處理程序并運(yùn)行相關(guān)的委托。

處理完回發(fā)事件之后,頁(yè)面就可以顯示了。這個(gè)階段的標(biāo)志是 PreRender 事件。控件可以利用這段時(shí)間來(lái)執(zhí)行那些需要在保存視圖狀態(tài)和顯示輸出的前一刻執(zhí)行的更新操作。下一個(gè)狀態(tài)是 SaveViewState,在此狀態(tài)中,所有控件和頁(yè)面本身都將更新自己 ViewState 集合的內(nèi)容。然后,將得到序列化、散列、Base64 編碼的視圖狀態(tài),而且此視圖狀態(tài)與隱藏字段 __VIEWSTATE 相關(guān)聯(lián)。

通過(guò)覆蓋 Render 方法可以改變各個(gè)控件的顯示機(jī)制。此方法接受 HTML 書(shū)寫(xiě)器對(duì)象,并使用此對(duì)象來(lái)積累所有要為控件生成的 HTML 文本。Page 類(lèi)的 Render 方法的默認(rèn)實(shí)現(xiàn)包括對(duì)所有成員控件的遞歸調(diào)用。對(duì)于每個(gè)控件,頁(yè)面都將調(diào)用 Render 方法,并緩存 HTML 輸出。

頁(yè)面生命中的最后一個(gè)標(biāo)志是 Unload 事件,在頁(yè)面對(duì)象消除之前發(fā)生。在此事件中,您應(yīng)該釋放所有可能占用的關(guān)鍵資源(例如文件、圖形對(duì)象、數(shù)據(jù)庫(kù)連接等)。

在此事件之后,也就是最后,瀏覽器接收 HTTP 響應(yīng)數(shù)據(jù)包并顯示頁(yè)面。

asp.net web生命周期

Asp.net相對(duì)以前的asp有了很大的發(fā)展.引用許多新的機(jī)制.本文是關(guān)于一個(gè)asp.net web生命周期的一個(gè)初步介紹.
      當(dāng)一個(gè)獲取網(wǎng)頁(yè)的請(qǐng)求(有可能是通過(guò)用戶(hù)提交,或者是通過(guò)用戶(hù)點(diǎn)擊鏈接完成)被提交到服務(wù)器后.緊接著這個(gè)web頁(yè)面就開(kāi)始運(yùn)行從創(chuàng)建到處理完成的一系列事件.在我們建立asp.net頁(yè)面的時(shí)候,這個(gè)過(guò)程我們是不必去考慮的.然而,如果被正確的操縱,一個(gè)頁(yè)面的執(zhí)行周期將是一道有效而且功能強(qiáng)大的工具。許多開(kāi)發(fā)者在編寫(xiě)Asp.net的頁(yè)面以及用戶(hù)控件的時(shí)候發(fā)現(xiàn),如果知道整個(gè)過(guò)程中發(fā)生了什么以及在什么時(shí)候發(fā)生將對(duì)完成整個(gè)任務(wù)起到很重要的幫助作用。下面我就向大家介紹一下一個(gè)Asp.net頁(yè)面從創(chuàng)建到處理完成過(guò)程中的十個(gè)事件。同時(shí),也向大家展示如何在這些事件中添加自己的代碼以達(dá)到預(yù)定的效果。
       一、初始化對(duì)象
       一個(gè)頁(yè)面的控件(以及頁(yè)面本身)最初應(yīng)被正確的初始化。通過(guò)在你的C#文件的構(gòu)造函數(shù)中聲名所有對(duì)象,頁(yè)面就知道要?jiǎng)?chuàng)建多少對(duì)象以及它們的類(lèi)型。一旦你在你的構(gòu)造函數(shù)中聲名了所有的對(duì)象,你就可以通過(guò)繼承類(lèi)、方法、事件或是屬性訪(fǎng)問(wèn)它們。然而,如果你的一些對(duì)象是在Aspx文件中指定的一些控件,那么這些控件就沒(méi)有屬性可言了。同時(shí),通過(guò)代碼訪(fǎng)問(wèn)它們會(huì)產(chǎn)生一些意外的錯(cuò)誤,因?yàn)檫@些控件實(shí)例是沒(méi)有一個(gè)確定的創(chuàng)建順序的(如果它們是被一起創(chuàng)建的)。還有,你可以通過(guò)OnInit來(lái)重載初始化事件.
      二、導(dǎo)入Viewstate數(shù)據(jù)
      在初始化事件后,所有控件只可以通過(guò)它們的ID被引用訪(fǎng)問(wèn)(因?yàn)檫€沒(méi)有相應(yīng)的DOM可使用)。在LoadViewState這個(gè)事件中,所有的控件將獲得它們的第一個(gè)屬性:Viewstate屬性。這個(gè)屬性最終將被返回給服務(wù)器以判斷這個(gè)頁(yè)面是已經(jīng)被用戶(hù)訪(fǎng)問(wèn)完畢還是仍然在被用戶(hù)所訪(fǎng)問(wèn)。Viewstate屬性以“名稱(chēng)/值”對(duì)的字符串方式被保存,它包含了控件的文本以及值等信息。該屬性被存儲(chǔ)在一個(gè)隱藏的input type="hidden" />控件的值屬性里,在請(qǐng)求頁(yè)面的時(shí)候被傳遞。還可以重載LoadViewState事件函數(shù)來(lái)對(duì)相應(yīng)的控件進(jìn)行值設(shè)定.如圖:
聯(lián)單 


       三、用LoadPostData處理Postback數(shù)據(jù)
       在頁(yè)面創(chuàng)建的這個(gè)階段,服務(wù)器對(duì)頁(yè)面上的控件提交的表單數(shù)據(jù)(在Asp.net中稱(chēng)postback數(shù)據(jù))進(jìn)行處理。當(dāng)一個(gè)頁(yè)面提交一個(gè)表單時(shí),框架就在每個(gè)提交了數(shù)據(jù)的控件上執(zhí)行一個(gè)IPostBackDataHandler接口操作。然后頁(yè)面執(zhí)行LoadPostData事件,解析頁(yè)面,找到每個(gè)執(zhí)行了IpostBackDataHandler接口操作的控件,并用恰當(dāng)?shù)膒ostback數(shù)據(jù)更新這些控件狀態(tài)。Asp.net是通過(guò)用NameValue集中的“名稱(chēng)/值”對(duì)和每個(gè)控件的唯一的ID匹配來(lái)實(shí)現(xiàn)這一操作的。所以,在Asp.net的頁(yè)面上每個(gè)控件必須有一個(gè)唯一的ID,不可以出現(xiàn)幾個(gè)控件共有ID的情況。即使是用戶(hù)自定義的一些控件,框架也會(huì)賦予它們各自唯一的ID的。在LoadPostData事件后,就要執(zhí)行下面的RaisePostDataChanged事件了。
       四、導(dǎo)入對(duì)象
       在Load事件中,對(duì)象都實(shí)例化了。所有的對(duì)象第一次被布置在DOM頁(yè)面(在Asp.net中稱(chēng)控件樹(shù))里了并且可以通過(guò)代碼或是相關(guān)的位置被引用。這樣,對(duì)象就可以很容易的從客戶(hù)端獲得諸如寬度、高度、值、可見(jiàn)性等在Html中的屬性值。在Load事件中,當(dāng)然還有像設(shè)置控件屬性等操作的發(fā)生。這個(gè)過(guò)程是整個(gè)生命周期中最重要、最主要的,你可以通過(guò)調(diào)用OnLoad來(lái)重載Load事件。如圖:

        五、RaisePostBackChanged事件
        就像在上面提到的那樣,這個(gè)事件是發(fā)生在所有的控件執(zhí)行了IPostBackDataHandler接口操作并被正確的postback數(shù)據(jù)更新后的。在這個(gè)過(guò)程中,每個(gè)控件都被賦予一個(gè)布爾值來(lái)標(biāo)志該控件有沒(méi)有被更新。然后,Asp.net就在整個(gè)頁(yè)面上尋找任何已被更新過(guò)的控件并執(zhí)行RaisePostDataChanged事件操作。不過(guò),這個(gè)事件是要在所有的控件都被更新了以及Load事件完成后才進(jìn)行的。這樣就保證了一個(gè)控件在被postback數(shù)據(jù)更新前,別的控件在RaisePostDataChanged事件中是不會(huì)被手動(dòng)改變的。
        六、處理客戶(hù)端PostBack事件
        當(dāng)由postback數(shù)據(jù)在服務(wù)器端引起的事件都完成后,產(chǎn)生postback數(shù)據(jù)的對(duì)象就執(zhí)行RaisePostBackEvent事件操作??墒菚?huì)有這種情況,由于一個(gè)控件狀態(tài)的改變使得它將表單返回給服務(wù)器或是用戶(hù)點(diǎn)擊了提交按鈕使得表單返回給服務(wù)器。在這種情況下應(yīng)該有相應(yīng)的處理代碼來(lái)體現(xiàn)事件驅(qū)動(dòng)這一面向?qū)ο螅∣OP)編程原則。由于要滿(mǎn)足呈現(xiàn)給瀏覽器的數(shù)據(jù)的精確性要求,在一系列postback事件中RaisePostBackEvent事件是最后發(fā)生的。在postback過(guò)程中改變的控件不應(yīng)在執(zhí)行功能函數(shù)被調(diào)用后更新。也就是說(shuō),任何由于一個(gè)預(yù)期的事件而改變的數(shù)據(jù)應(yīng)該在最終的頁(yè)面上被反映出來(lái)。你可以通過(guò)修改RaisePostBackEvent函數(shù)來(lái)滿(mǎn)足你的要求.
        七、預(yù)先呈遞對(duì)象
         可以改變對(duì)象并將改變保存的最后時(shí)刻就是這一步――預(yù)先呈遞對(duì)象。這樣,你可以在這一步對(duì)控件的屬性、控件樹(shù)結(jié)構(gòu)等作出最后的修改。同時(shí)還不用考慮Asp.net對(duì)其作出任何改變,因?yàn)榇藭r(shí)已經(jīng)脫離了數(shù)據(jù)庫(kù)調(diào)用以及viewstate更新了。在這一步之后,對(duì)對(duì)象的所有修改將最終被確定,不能被保存到頁(yè)面的viewstate中了。你可以通過(guò)OnPreRender來(lái)重載這一步。
          八、保存ViewState
         所有對(duì)頁(yè)面控件的修改完成后viewstate就被保存了。對(duì)像的狀態(tài)數(shù)據(jù)還是保留在隱藏的input type="hidden" />控件里面,呈現(xiàn)給Html的對(duì)象狀態(tài)數(shù)據(jù)也是從這里取得的。在SaveViewState事件中,其值能被保存到viewstate對(duì)象,然而這時(shí)在頁(yè)面上控件的修改卻不能了。你可以用SaveViewState來(lái)重載這一步.如圖:

        九、呈遞給HTML
        運(yùn)用Html創(chuàng)建給瀏覽器輸出的頁(yè)面的時(shí)候Render事件就發(fā)生了。在Render事件過(guò)程中,頁(yè)面調(diào)用其中的對(duì)象將它們呈遞給Html。然后,頁(yè)面就可以以Html的形式被用戶(hù)的瀏覽器訪(fǎng)問(wèn)了。當(dāng)Render事件被重載時(shí),開(kāi)發(fā)者可以編寫(xiě)自定義的Html代碼使得原先生成的Html都無(wú)效而按照新的Html來(lái)組織頁(yè)面。Render方法將一個(gè)HtmlTextWriter對(duì)象作為參數(shù)并用它將Html在瀏覽器上以網(wǎng)頁(yè)的形式顯示。這時(shí)仍然可以做一些修改動(dòng)作,不過(guò)它們只是客戶(hù)端的一些變化而已了。你可以重載Render事件.如圖:

       十、銷(xiāo)毀對(duì)象
       在呈遞給Html完成后,所有的對(duì)象都應(yīng)被銷(xiāo)毀。在Dispose事件中,你應(yīng)該銷(xiāo)毀所有在建立這個(gè)頁(yè)面時(shí)創(chuàng)建的對(duì)象。這時(shí),所有的處理已經(jīng)完畢,所以銷(xiāo)毀任何剩下的對(duì)象都是不會(huì)產(chǎn)生錯(cuò)誤的,包括頁(yè)面對(duì)象。你可以重載Dispose事件.
      全文總結(jié):
      以上就是Asp.net頁(yè)面生命周期中的十個(gè)事件。每次我們請(qǐng)求一個(gè)Asp.net頁(yè)面時(shí),我們都經(jīng)歷著同樣的過(guò)程:從初始化對(duì)象到銷(xiāo)毀對(duì)象。通過(guò)了解Asp.net頁(yè)面的內(nèi)部運(yùn)行機(jī)制
您可能感興趣的文章:
  • 詳解ASP.NET頁(yè)面生命周期
  • asp.net頁(yè)面生命周期詳解
  • 詳解ASP.NET頁(yè)面生命周期事件
  • ASP.NET 頁(yè)生命周期概述(小結(jié))

標(biāo)簽:克拉瑪依 呼倫貝爾 阿里 潛江 運(yùn)城 綏化 西藏 洛陽(yáng)

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《ASP.NET Web頁(yè)生命周期和執(zhí)行的方法介紹》,本文關(guān)鍵詞  ASP.NET,Web,頁(yè),生命,周期,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《ASP.NET Web頁(yè)生命周期和執(zhí)行的方法介紹》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于ASP.NET Web頁(yè)生命周期和執(zhí)行的方法介紹的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章