Asp.net頁面的生命週期

來源:互聯網
上載者:User
asp.net|頁面

介紹
Asp.net是微軟.Net戰略的一個組成部分。它相對以前的Asp有了很大的發展,引入了許多的新機制。本文就Asp.net頁面的生命週期向大家做一個初步的介紹,以期能起到指導大家更好、更靈活地操縱Asp.net的作用。
當一個擷取網頁的請求(可能是通過使用者提交完成的,也可能是通過超連結完成的)被發送到Web伺服器後,這個頁面就會接著運行從建立到處理完成的一系列事件。在我們試圖建立Asp.net頁面的時候,這個執行循環是不必去考慮的,那樣只會自討苦吃。然而,如果被正確的操縱,一個頁面的執行循環將是一道有效而且功能強大的工具。許多開發人員在編寫Asp.net的頁面以及使用者控制項的時候發現,如果知道整個過程中發生了什麼以及在什麼時候發生將對完成整個任務起到很重要的協助作用。下面我就向大家介紹一下一個Asp.net頁面從建立到處理完成過程中的十個事件。同時,也向大家展示如何在這些事件中添加自己的代碼以達到預定的效果。
一.初始化對象
一個頁面的控制項(以及頁面本身)最初應被正確的初始化。通過在你的C#檔案的建構函式中聲名所有對象(如圖1),頁面就知道要建立多少對象以及它們的類型。一旦你在你的建構函式中聲名了所有的對象,你就可以通過繼承類、方法、事件或是屬性訪問它們。然而,如果你的一些對象是在Aspx檔案中指定的一些控制項,那麼這些控制項就沒有屬性可言了。同時,通過代碼訪問它們會產生一些意外的錯誤,因為這些控制項執行個體是沒有一個確定的建立順序的(如果它們是被一起建立的)。還有,你可以通過OnInit來重載初始化事件,圖示如下(圖1):


二.匯入Viewstate資料
在初始化事件後,所有控制項只可以通過它們的ID被引用訪問(因為還沒有相應的DOM可使用)。在LoadViewState這個事件中,所有的控制項將獲得它們的第一個屬性:Viewstate屬性。這個屬性最終將被返回給伺服器以判斷這個頁面是已經被使用者訪問完畢還是仍然在被使用者所訪問。Viewstate屬性以“名稱/值”對的字串方式被儲存,它包含了控制項的文本以及值等資訊。該屬性被儲存在一個隱藏的<input>控制項的值屬性裡,在請求頁面時被傳遞。這種方式比起Asp3.0的維持、判斷頁面狀態的方式有了很大的進步啊。還有,你可以重載LoadViewState事件函數來對相應的控制項進行值設定。下圖(圖2)是一個例子:

三.用LoadPostData處理Postback資料
在頁面建立的這個階段,伺服器對頁面上的控制項提交的表單資料(在Asp.net中稱postback資料)進行處理。當一個頁面提交一個表單時,架構就在每個提交了資料的控制項上執行一個IPostBackDataHandler介面操作。然後頁面執行LoadPostData事件,解析頁面,找到每個執行了IpostBackDataHandler介面操作的控制項,並用恰當的postback資料更新這些控制項狀態。Asp.net是通過用NameValue集中的“名稱/值”對和每個控制項的唯一的ID匹配來實現這一操作的。所以,在Asp.net的頁面上每個控制項必須有一個唯一的ID,不可以出現幾個控制項共有ID的情況。即使是使用者自訂的一些控制項,架構也會賦予它們各自唯一的ID的。在LoadPostData事件後,就要執行下面的RaisePostDataChanged事件了。
四.匯入對象
在Load事件中,對象都執行個體化了。所有的對象第一次被布置在DOM頁面(在Asp.net中稱控制項樹)裡了並且可以通過代碼或是相關的位置被引用。這樣,對象就可以很容易的從用戶端獲得諸如寬度、高度、值、可見度等在Html中的屬性值。在Load事件中,當然還有像設定控制項屬性等操作的發生。這個過程是整個生命週期中最重要、最主要的,你可以通過調用OnLoad來重載Load事件,圖示如下(圖3):

五.RaisePostBackChanged事件
就像在上面提到的那樣,這個事件是發生在所有的控制項執行了IPostBackDataHandler介面操作並被正確的postback資料更新後的。在這個過程中,每個控制項都被賦予一個布爾值來標誌該控制項有沒有被更新。然後,Asp.net就在整個頁面上尋找任何已被更新過的控制項並執行RaisePostDataChanged事件操作。不過,這個事件是要在所有的控制項都被更新了以及Load事件完成後才進行的。這樣就保證了一個控制項在被postback資料更新前,別的控制項在RaisePostDataChanged事件中是不會被手動改變的。
六.處理用戶端PostBack事件
當由postback資料在伺服器端引起的事件都完成後,產生postback資料的對象就執行RaisePostBackEvent事件操作。可是會有這種情況,由於一個控制項狀態的改變使得它將表單返回給伺服器或是使用者點擊了提交按鈕使得表單返回給伺服器。在這種情況下應該有相應的處理代碼來體現事件驅動這一物件導向(OOP)編程原則。由於要滿足呈現給瀏覽器的資料的精確性要求,在一系列postback事件中RaisePostBackEvent事件是最後發生的。
在postback過程中改變的控制項不應在執行功能函數被調用後更新。也就是說,任何由於一個預期的事件而改變的資料應該在最終的頁面上被反映出來。你可以通過修改RaisePostBackEvent函數來滿足你的要求,圖示如下(圖4):

七.預先呈遞對象
可以改變對象並將改變儲存的最後時刻就是這一步――預先呈遞對象。這樣,你可以在這一步對控制項的屬性、控制項樹結構等作出最後的修改。同時還不用考慮Asp.net對其作出任何改變,因為此時已經脫離了資料庫調用以及viewstate更新了。在這一步之後,對對象的所有修改將最終被確定,不能被儲存到頁面的viewstate中了。你可以通過OnPreRender來重載這一步。
八.儲存ViewState
所有對頁面控制項的修改完成後viewstate就被儲存了。對像的狀態資料還是保留在隱藏的<input>控制項裡面,呈現給Html的對象狀態資料也是從這裡取得的。在SaveViewState事件中,其值能被儲存到viewstate對象,然而這時在頁面上控制項的修改卻不能了。你可以用SaveViewState來重載這一步,圖示如下(圖5):

九.呈遞給Html
運用Html建立給瀏覽器輸出的頁面的時候Render事件就發生了。在Render事件程序中,頁面調用其中的對象將它們呈遞給Html。然後,頁面就可以以Html的形式被使用者的瀏覽器訪問了。當Render事件被重載時,開發人員可以編寫自訂的Html代碼使得原先產生的Html都無效而按照新的Html來組織頁面。Render方法將一個HtmlTextWriter對象作為參數並用它將Html在瀏覽器上以網頁的形式顯示。這時仍然可以做一些修改動作,不過它們只是用戶端的一些變化而已了。你可以重載Render事件,圖示如下(圖6):

十.銷毀對象
在呈遞給Html完成後,所有的對象都應被銷毀。在Dispose事件中,你應該銷毀所有在建立這個頁面時建立的對象。這時,所有的處理已經完畢,所以銷毀任何剩下的對象都是不會產生錯誤的,包括頁面對象。你可以重載Dispose事件,見圖6。
全文總結
以上就是Asp.net頁面生命週期中的十個事件。每次我們請求一個Asp.net頁面時,我們都經曆著同樣的過程:從初始化對象到銷毀對象。通過瞭解Asp.net頁面的內部運行機制,我相信大家在編寫、調試代碼的時候會更加遊刃有餘的。



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。