ASP.NET - Page 的生命周期
初始化(Initialization)
頁(yè)面被請(qǐng)求時(shí),第一個(gè)被執(zhí)行的總是構(gòu)造函數(shù)(constructor). 你可以在這里初始化很多自定義屬性或?qū)ο蟆2贿^(guò)這里有一些限制,因?yàn)?page 還沒(méi)有被完全初始化。特別地,你必須使用 HttpContext.Current 來(lái)訪問(wèn) QueryString, Form, Cookies 集合,以及 Cache 對(duì)象。而 Session 對(duì)象在 constructor 里是無(wú)法訪問(wèn)的。
下面接著執(zhí)行的是?AddParsedSubObject 方法,這個(gè)方法把組成該 page 的所有子控件添加到控件集合樹(shù)中。在很多高級(jí)的頁(yè)面模板解決方案中,該方法通常被覆蓋,以便把頁(yè)面的控件添加到一個(gè)特殊的頁(yè)面模板中去。該方法遞歸的被子控件調(diào)用,所有這些子控件都是這時(shí)候初始化的,從最里面的開(kāi)始。
接著是?DeterminePostBackMode 方法。該方法允許你影響 IsPostBack 的值,以及相關(guān)事件。如果你想從數(shù)據(jù)庫(kù)中加載 ViewState 以便 redirect 時(shí),這個(gè)可能對(duì)你有用。因?yàn)?ViewState 僅僅在 IsPostBack 為 true 的時(shí)候被恢復(fù)。
你可以通過(guò)返回 null 來(lái)強(qiáng)制不 postback, 或者返回 Request.Form 來(lái)強(qiáng)制 postback. 這個(gè)方法是不推薦使用的,除非是在特殊的情況下,因?yàn)樗€影響其他的事件。
然后是?OnInit 方法。通常這是我們使用到的第一個(gè)方法。這時(shí),所有控件已經(jīng)被初始化,也就是說(shuō)所有原始值都被設(shè)定了。而 ViewState 以及所有其他 post 的值還沒(méi)有被應(yīng)用到控件上。也就是說(shuō)這時(shí)候所有通過(guò)代碼或者用戶操作做的更改還沒(méi)有被恢復(fù)。這通常是創(chuàng)建或重新創(chuàng)建動(dòng)態(tài)控件的最佳時(shí)機(jī)。
恢復(fù)和加載(Restore and Load)
接下來(lái)的?LoadPageStateFromPersistenceMedium 方法,僅僅在 PostBack 時(shí)被執(zhí)行。當(dāng)你要改變保存 ViewState 的方法時(shí)(使用 Session 或其他自定義的儲(chǔ)存方法),覆蓋這個(gè)方法,以及后面的 SavePageStateToPersistenceMedium 方法。注意:該方法并不真正加載 ViewState 到 page 及其子控件。
ViewState 被取回后,接著?LoadViewState 方法將它們恢復(fù)到 page, 并遞歸的恢復(fù)到每一個(gè)子控件(只有 PostBack 的那些).這時(shí),每個(gè)控件已經(jīng)被恢復(fù)到了它上次執(zhí)行時(shí)的狀態(tài),但用戶 post 的值還沒(méi)有被應(yīng)用。因?yàn)檫@屬于 ViewState. 這個(gè)方法是恢復(fù)所有在事件中創(chuàng)建的動(dòng)態(tài)控件的最好時(shí)機(jī)。
下一個(gè)是?ProcessPostData 方法。僅僅在 PostBack 時(shí)被執(zhí)行。而且這個(gè)方法不能被覆蓋,因?yàn)樗琼?yè)面基類(lèi)中實(shí)現(xiàn)的一個(gè)私有方法。這個(gè)方法最終將用戶 post 的值,通過(guò)匹配控件的名稱的方法,恢復(fù)到頁(yè)面。這時(shí),page 已經(jīng)被完全恢復(fù)了。動(dòng)態(tài)控件必須在這個(gè)方法之前被創(chuàng)建。這個(gè)方法同時(shí)也為稍后的 changed 事件記錄控件值的改變。
然后才是?OnLoad 方法。大部分的代碼中都使用這個(gè)方法,因?yàn)檫@是在 page 的生命周期中,第一個(gè)所有的值都被恢復(fù)了的地方。我們可以通過(guò)檢查 IsPostBack 屬性來(lái)避免不必要的重設(shè)狀態(tài)。同時(shí)也可以檢查 IsValid 屬性來(lái)進(jìn)行驗(yàn)證。同時(shí)還可以在這里創(chuàng)建動(dòng)態(tài)控件。所有這些控件的方法都會(huì)被執(zhí)行并捕獲,包括 ViewState. 但回發(fā)的值不可以。
Raised Events
下一個(gè)方法,ProcessPostData 方法, 實(shí)際上是前面那個(gè)方法的第二個(gè)入口(second pass)。它僅僅處理回發(fā),而且由于是私有方法,所以不能被覆蓋。這個(gè)方法顯得有些奇怪,但又是必要的。因?yàn)樵?OnLoad 方法中重建的動(dòng)態(tài)控件需要他們回發(fā)的值。所有在這個(gè)方法之后創(chuàng)建的動(dòng)態(tài)控件,將只能恢復(fù) ViewState, 而不能恢復(fù)回發(fā)的值,并且不能觸發(fā)任何更改事件。
下一個(gè)方法,?RaiseChangedEvents, 同樣僅僅用于回發(fā)時(shí)。它是一個(gè)基類(lèi)實(shí)現(xiàn)的私有方法。這時(shí) changed 事件被真正觸發(fā)。這基于前面 ProcessPostData 方法中標(biāo)注出回發(fā)的值的差異。當(dāng)有多個(gè) changed 事件被觸發(fā)時(shí),其先后順序是沒(méi)有保證的。
下面是?RaisePostBackEvent 方法。僅用于回發(fā),而且是基類(lèi)實(shí)現(xiàn)的私有方法。這是真正提交 form 的方法,除非是 postback。比如按鈕,或者其他通過(guò) javascript 提交的控件被觸發(fā)。如果使用了 Validators, 如沒(méi)有手動(dòng)調(diào)用 Validate 方法,這時(shí)也已經(jīng)被調(diào)用了。有時(shí)候 ie 的 bug 會(huì)使得表單被提交,而不引發(fā)事件。
接著是?OnPreRender 方法。這通常是在被繪制到瀏覽器之前,要更改 page 及其子控件的最后機(jī)會(huì)。你也可以在這里創(chuàng)建動(dòng)態(tài)控件。但這時(shí)只能捕獲 ViewState, 而不能接受 posted values, 而且沒(méi)有事件。因?yàn)樯厦嫣岬降?ie 的 bug, 這里可以用來(lái)捕獲沒(méi)有觸發(fā)事件的 post back.
保存和繪制(Save and Render)
下一個(gè)是?SaveViewState 方法。 不管是否 post back. 遞歸的應(yīng)用到每一個(gè)子控件。ViewState 一般保存所有和 aspx 頁(yè)面里不一樣的屬性,不管是被代碼還是用戶更改的。注意,由于控件的值是通過(guò)他們?cè)诳丶?shù)中的位置來(lái)保存的,所以如果在這之后添加動(dòng)態(tài)控件到錯(cuò)誤的位置, ViewState 可能會(huì)崩潰。
下面是?SavePageStateToPersistenceMedium 方法。它真正的保存 page 的 ViewState. 這個(gè)方法可覆蓋。如果重寫(xiě)的話,注意這里由于 asp.net 的 bug, 需要手工設(shè)定一下 __VIEWSTATE,哪怕是空值。
接著是?Render 方法。它遞歸的調(diào)用到每個(gè)子控件,真正的繪制各自的 html, 發(fā)送到瀏覽器。在一些頁(yè)面模板方案中,常常在這里添加通用的 header 和 footer. 而不用使用服務(wù)器控件。 注意在這里能作的更改必須是純的 html. 因?yàn)檫@時(shí)候控件都已經(jīng)繪制完了。
最后是?OnUnload 方法。它調(diào)用了 Dispose 方法。這個(gè)方法可以用來(lái)清理頁(yè)面中使用的非托管資源。特別是類(lèi)似于關(guān)閉打開(kāi)的文件或數(shù)據(jù)庫(kù)連接等。該方法只有當(dāng)頁(yè)面已經(jīng)被發(fā)送到客戶端瀏覽器后才發(fā)生。所以它只能對(duì)服務(wù)端的對(duì)象起作用。所以他不能在 page 的 trace 中被顯示。
上面就是 page 的生命循環(huán)。每次有一個(gè)新的請(qǐng)求時(shí),以上過(guò)程就重復(fù)一次。
Listing 1: Page 的事件小結(jié)
| Method | PostBack | Controls |
| Constructor | Always | All |
| AddParsedSubObject | Always | All |
| DeterminePostBackMode | Always | Page |
| OnInit | Always | All |
| LoadPageStateFromPersistenceMedium | PostBack | Page |
| LoadViewState | PostBack | All |
| ProcessPostData1 | PostBack | Page |
| OnLoad | Always | All |
| ProcessPostData2 | PostBack | Page |
| RaiseChangedEvents | PostBack | Page |
| RaisePostBackEvent | PostBack | Page |
| OnPreRender | Always | All |
| SaveViewState | Always | All |
| SavePageStateToPersistenceMedium | Always | Page |
| Render | Always | All |
| OnUnload | Always | All |
?
原文:http://www.cnblogs.com/dudu/articles/118917.html?
轉(zhuǎn)載于:https://www.cnblogs.com/raysbo/archive/2011/04/25/2028740.html
總結(jié)
以上是生活随笔為你收集整理的ASP.NET - Page 的生命周期的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 《梦仙》第十三句是什么
- 下一篇: VS2008 VS2010发布网站时如