Aspx页面生命周期(转)
| 頁請求 | 頁請求發(fā)生在頁生命周期開始之前。用戶請求頁時(shí),ASP.NET 將確定是否需要分析和編譯頁(從而開始頁的生命周期),或者是否可以在不運(yùn)行頁的情況下發(fā)送頁的緩存版本以進(jìn)行響應(yīng)。 |
| 開始 | 在開始階段,將設(shè)置頁屬性,如 Request 和 Response。在此階段,頁還將確定請求是回發(fā)請求還是新請求,并設(shè)置 IsPostBack 屬性。此外,在開始階段期間,還將設(shè)置頁的 UICulture 屬性。 |
| 頁初始化 | 頁初始化期間,可以使用頁中的控件,并將設(shè)置每個(gè)控件的 UniqueID 屬性。此外,任何主題都將應(yīng)用于頁。如果當(dāng)前請求是回發(fā)請求,則回發(fā)數(shù)據(jù)尚未加載,并且控件屬性值尚未還原為視圖狀態(tài)中的值。 |
| 加載 | 加載期間,如果當(dāng)前請求是回發(fā)請求,則將使用從視圖狀態(tài)和控件狀態(tài)恢復(fù)的信息加載控件屬性。 |
| 驗(yàn)證 | 在驗(yàn)證期間,將調(diào)用所有驗(yàn)證程序控件的 Validate 方法,此方法將設(shè)置各個(gè)驗(yàn)證程序控件和頁的 IsValid 屬性。 |
| 回發(fā)事件處理 | 如果請求是回發(fā)請求,則將調(diào)用所有事件處理程序。 |
| 呈現(xiàn) | 在呈現(xiàn)之前,會針對該頁和所有控件保存視圖狀態(tài)。在呈現(xiàn)階段中,頁會針對每個(gè)控件調(diào)用 Render 方法,它會提供一個(gè)文本編寫器,用于將控件的輸出寫入頁的 Response 屬性的 OutputStream 中。 |
| 卸載 | 完全呈現(xiàn)頁并已將頁發(fā)送至客戶端、準(zhǔn)備丟棄該頁后,將調(diào)用卸載。此時(shí),將卸載頁屬性(如 Response 和 Request)并執(zhí)行清理。 |
頁面被請求時(shí),第一個(gè)被執(zhí)行的總是構(gòu)造函數(shù)(constructor). 你可以在這里初始化很多自定義屬性或?qū)ο蟆2贿^這里有一些限制,因?yàn)?page 還沒有被完全初始化。特別地,你必須使用 HttpContext.Current 來訪問 QueryString, Form, Cookies 集合,以及 Cache 對象。而 Session 對象在 constructor 里是無法訪問的。 下面接著執(zhí)行的是 AddParsedSubObject 方法,這個(gè)方法把組成該 page 的所有子控件添加到控件集合樹中。在很多高級的頁面模板解決方案中,該方法通常被覆蓋,以便把頁面的控件添加到一個(gè)特殊的頁面模板中去。該方法遞歸的被子控件調(diào)用,所有這些子控件都是這時(shí)候初始化的,從最里面的開始。 接著是 DeterminePostBackMode 方法。該方法允許你影響 IsPostBack 的值,以及相關(guān)事件。如果你想從數(shù)據(jù)庫中加載 ViewState 以便 redirect 時(shí),這個(gè)可能對你有用。因?yàn)?ViewState 僅僅在 IsPostBack 為 true 的時(shí)候被恢復(fù)。你可以通過返回 null 來強(qiáng)制不 postback, 或者返回 Request.Form 來強(qiáng)制 postback. 這個(gè)方法是不推薦使用的,除非是在特殊的情況下,因?yàn)樗€影響其他的事件。 然后是 OnInit 方法。通常這是我們使用到的第一個(gè)方法。這時(shí),所有控件已經(jīng)被初始化,也就是說所有原始值都被設(shè)定了。而 ViewState 以及所有其他 post 的值還沒有被應(yīng)用到控件上。也就是說這時(shí)候所有通過代碼或者用戶操作做的更改還沒有被恢復(fù)。這通常是創(chuàng)建或重新創(chuàng)建動態(tài)控件的最佳時(shí)機(jī)。 恢復(fù)和加載(Restore and Load) 接下來的 LoadPageStateFromPersistenceMedium 方法,僅僅在 PostBack 時(shí)被執(zhí)行。當(dāng)你要改變保存 ViewState 的方法時(shí)(使用 Session 或其他自定義的儲存方法),覆蓋這個(gè)方法,以及后面的 SavePageStateToPersistenceMedium 方法。注意:該方法并不真正加載 ViewState 到 page 及其子控件。 ViewState 被取回后,接著 LoadViewState 方法將它們恢復(fù)到 page, 并遞歸的恢復(fù)到每一個(gè)子控件(只有 PostBack 的那些).這時(shí),每個(gè)控件已經(jīng)被恢復(fù)到了它上次執(zhí)行時(shí)的狀態(tài),但用戶 post 的值還沒有被應(yīng)用。因?yàn)檫@屬于 ViewState. 這個(gè)方法是恢復(fù)所有在事件中創(chuàng)建的動態(tài)控件的最好時(shí)機(jī)。 下一個(gè)是 ProcessPostData 方法。僅僅在 PostBack 時(shí)被執(zhí)行。而且這個(gè)方法不能被覆蓋,因?yàn)樗琼撁婊愔袑?shí)現(xiàn)的一個(gè)私有方法。這個(gè)方法最終將用戶 post 的值,通過匹配控件的名稱的方法,恢復(fù)到頁面。這時(shí),page 已經(jīng)被完全恢復(fù)了。動態(tài)控件必須在這個(gè)方法之前被創(chuàng)建。這個(gè)方法同時(shí)也為稍后的 changed 事件記錄控件值的改變。 然后才是 OnLoad 方法。大部分的代碼中都使用這個(gè)方法,因?yàn)檫@是在 page 的生命周期中,第一個(gè)所有的值都被恢復(fù)了的地方。我們可以通過檢查 IsPostBack 屬性來避免不必要的重設(shè)狀態(tài)。同時(shí)也可以檢查 IsValid 屬性來進(jìn)行驗(yàn)證。同時(shí)還可以在這里創(chuàng)建動態(tài)控件。所有這些控件的方法都會被執(zhí)行并捕獲,包括 ViewState. 但回發(fā)的值不可以。 Raised Events 下一個(gè)方法,ProcessPostData 方法, 實(shí)際上是前面那個(gè)方法的第二個(gè)入口(second pass)。它僅僅處理回發(fā),而且由于是私有方法,所以不能被覆蓋。這個(gè)方法顯得有些奇怪,但又是必要的。因?yàn)樵?OnLoad 方法中重建的動態(tài)控件需要他們回發(fā)的值。所有在這個(gè)方法之后創(chuàng)建的動態(tài)控件,將只能恢復(fù) ViewState, 而不能恢復(fù)回發(fā)的值,并且不能觸發(fā)任何更改事件。 下一個(gè)方法, RaiseChangedEvents, 同樣僅僅用于回發(fā)時(shí)。它是一個(gè)基類實(shí)現(xiàn)的私有方法。這時(shí) changed 事件被真正觸發(fā)。這基于前面 ProcessPostData 方法中標(biāo)注出回發(fā)的值的差異。當(dāng)有多個(gè) changed 事件被觸發(fā)時(shí),其先后順序是沒有保證的。 下面是 RaisePostBackEvent 方法。僅用于回發(fā),而且是基類實(shí)現(xiàn)的私有方法。這是真正提交 form 的方法,除非是 postback。比如按鈕,或者其他通過 javascript 提交的控件被觸發(fā)。如果使用了 Validators, 如沒有手動調(diào)用 Validate 方法,這時(shí)也已經(jīng)被調(diào)用了。有時(shí)候 ie 的 bug 會使得表單被提交,而不引發(fā)事件。 接著是 OnPreRender 方法。這通常是在被繪制到瀏覽器之前,要更改 page 及其子控件的最后機(jī)會。你也可以在這里創(chuàng)建動態(tài)控件。但這時(shí)只能捕獲 ViewState, 而不能接受 posted values, 而且沒有事件。因?yàn)樯厦嫣岬降?ie 的 bug, 這里可以用來捕獲沒有觸發(fā)事件的 post back. 保存和繪制(Save and Render) 下一個(gè)是 SaveViewState 方法。 不管是否 post back. 遞歸的應(yīng)用到每一個(gè)子控件。ViewState 一般保存所有和 aspx 頁面里不一樣的屬性,不管是被代碼還是用戶更改的。注意,由于控件的值是通過他們在控件樹中的位置來保存的,所以如果在這之后添加動態(tài)控件到錯(cuò)誤的位置, ViewState 可能會崩潰。 下面是 SavePageStateToPersistenceMedium 方法。它真正的保存 page 的 ViewState. 這個(gè)方法可覆蓋。如果重寫的話,注意這里由于 asp.net 的 bug, 需要手工設(shè)定一下 __VIEWSTATE,哪怕是空值。 接著是 Render 方法。它遞歸的調(diào)用到每個(gè)子控件,真正的繪制各自的 html, 發(fā)送到瀏覽器。在一些頁面模板方案中,常常在這里添加通用的 header 和 footer. 而不用使用服務(wù)器控件。 注意在這里能作的更改必須是純的 html. 因?yàn)檫@時(shí)候控件都已經(jīng)繪制完了。 最后是 OnUnload 方法。它調(diào)用了 Dispose 方法。這個(gè)方法可以用來清理頁面中使用的非托管資源。特別是類似于關(guān)閉打開的文件或數(shù)據(jù)庫連接等。該方法只有當(dāng)頁面已經(jīng)被發(fā)送到客戶端瀏覽器后才發(fā)生。所以它只能對服務(wù)端的對象起作用。所以他不能在 page 的 trace 中被顯示。 上面就是 page 的生命循環(huán)。每次有一個(gè)新的請求時(shí),以上過程就重復(fù)一次。
轉(zhuǎn)載于:https://www.cnblogs.com/elephant-wp/archive/2011/07/25/2116625.html
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的Aspx页面生命周期(转)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Transact-SQL 示例 - 查询
- 下一篇: MVVM Light学习笔记(三):Me