日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Aspx页面生命周期(转)

發(fā)布時間:2025/5/22 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Aspx页面生命周期(转) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
階段說明

頁請求

頁請求發(fā)生在頁生命周期開始之前。用戶請求頁時,ASP.NET 將確定是否需要分析和編譯頁(從而開始頁的生命周期),或者是否可以在不運行頁的情況下發(fā)送頁的緩存版本以進(jìn)行響應(yīng)。

開始

在開始階段,將設(shè)置頁屬性,如 RequestResponse。在此階段,頁還將確定請求是回發(fā)請求還是新請求,并設(shè)置 IsPostBack 屬性。此外,在開始階段期間,還將設(shè)置頁的 UICulture 屬性。

頁初始化

頁初始化期間,可以使用頁中的控件,并將設(shè)置每個控件的 UniqueID 屬性。此外,任何主題都將應(yīng)用于頁。如果當(dāng)前請求是回發(fā)請求,則回發(fā)數(shù)據(jù)尚未加載,并且控件屬性值尚未還原為視圖狀態(tài)中的值。

加載

加載期間,如果當(dāng)前請求是回發(fā)請求,則將使用從視圖狀態(tài)和控件狀態(tài)恢復(fù)的信息加載控件屬性。

驗證

在驗證期間,將調(diào)用所有驗證程序控件的 Validate 方法,此方法將設(shè)置各個驗證程序控件和頁的 IsValid 屬性。

回發(fā)事件處理

如果請求是回發(fā)請求,則將調(diào)用所有事件處理程序。

呈現(xiàn)

在呈現(xiàn)之前,會針對該頁和所有控件保存視圖狀態(tài)。在呈現(xiàn)階段中,頁會針對每個控件調(diào)用 Render 方法,它會提供一個文本編寫器,用于將控件的輸出寫入頁的 Response 屬性的 OutputStream 中。

卸載

完全呈現(xiàn)頁并已將頁發(fā)送至客戶端、準(zhǔn)備丟棄該頁后,將調(diào)用卸載。此時,將卸載頁屬性(如 Response 和 Request)并執(zhí)行清理。

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

轉(zhuǎn)載于:https://www.cnblogs.com/elephant-wp/archive/2011/07/25/2116625.html

《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的Aspx页面生命周期(转)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。