Asp.net頁面生存周期

# 事件或方法 功能 描述   
1 Init 事件 頁面初始化 初始化設置。   
2 LoadViewState 方法 加載視圖狀態 填充ViewState屬性。   
3 LoadPostData 方法 處理回發數據 處理傳入窗體數據。   
4 Load 事件 加載頁面 頁面控件初始化完成并反映了客戶端的數據。   
5 RaisePostDataChangedEvent 方法 回發更改通知 引發更改事件。   
6 RaisePostBackEvent 方法 處理回發事件 處理引起回發的客戶端事件,并在服務上引發相應時間。   
7 PreRender 事件 頁面預呈現   
8 SaveViewState 方法 保存視圖狀態 將ViewState屬性保存到字符串中。   
9 Render 方法 呈現頁面   
10 Dispose 方法 處置 是否對昂貴資源的引用。   
11 Unload 事件 卸載頁面

(轉載)

對于ASP.NET開發者,理解ASP.NET的頁面生命周期是非常重要的。主要是為了搞明白在哪里放置特定的方法和在何時設置各種頁面屬性。但是記憶和理解頁面生命周期里提供的事件處理方法(method)非常困難。互聯網上有很多關于頁面生命周期內部機制的文章,所以本文只準備簡單覆蓋技術的基礎部分,更主要的目的是給大家提供一個簡單得記憶頁面生命周期的方法。

準確的記憶ASP.NET頁面生命周期每一個階段發生了什么事情是比較困難的,一種便于記憶的方法是根據各個階段的名字組合出一個縮寫。微軟的文檔給出的ASP.NET生命周期如下:

Page Request

Start

Page Initialization

Load

Validation

Postback event handling

Rendering

Unload

根據這個組合出一個縮寫非常容易。既然Page Request技術上并不是頁面生命周期的一部分(這個階段僅僅標示我們是否開始一個頁面周期或者從緩存加載一個頁面),我們為了方便,就不包括這一階段。

S – Start

I – Initialize

L – Load

V – Validate

E – Event Handling

R – Render

這樣就組合出一個縮寫“SILVER',這個英文單詞非常好記。當然,一定要記住頁面生命周期的最后一個環節unload沒有包括在里面。如果你覺得有必要,你可以記憶為“SILVER-U”或者“SILVER-YOU",盡管有點破壞這個記憶法的完美性。現在,我們非常容易就記住了頁面生命周期,接著我們總結一下每一步都發生了什么,都有什么事件伴隨著發生。

1. Start

在這個階段,頁面屬性,比如Request, Response, IsPostBack和UICulture 被創建。最為一個開發人員,大部分時候在這個階段你不需要做任何事。如果你需要調用或者重寫(override)這一階段的行為,可以使用PreInit方法創建或者重新創建動態控件,設置master page或者theme或者讀取和設置profile property的值。要注意的一點是,如果是回傳(postback)的頁面請求,所有控件的值還沒有從view state里還原,如果你在這個階段設置一個控件的值,這個值有可能在下面的階段被重寫并覆蓋 2. Initialize

這個階段對于開發人員是很重要。在這個階段,theme被應用,所有的控件都被設置了唯一的ID。開發人員在這個階段可以調用Init, InitComplete和PreLoad 方法。微軟關于這些方法使用的建議如下:

Init – 這個事件發生在所有控件被初始化并且皮膚設置也被應用后。使用這個事件來讀取控件的初始化值。

InitComplete – 這個事件被Page對象觸發,使用這個事件處理那些要求所有初始化工作都完成后才能做的事情。

PreLoad - 如果在頁面或者控件進入Load事件前你有什么要處理的,使用這個事件。Page在觸發這個事件后,Page就會為自己和所有的控件加載view state并且處理所有Request中的postback數據。

3. Load

這個階段可能是開發者使用得最多的一個階段。在這個階段,所有的控件被viewstate中信息填充并被加載,OnLoad事件被觸發。在這個階段你可以為頁面上所有的服務端控件設置屬性,得到query strings,建立數據庫連接。

4. Validation

如果你的控件要求驗證,驗證會在這個階段發生,這個時候你可以檢查控件的IsValid屬性。跟這個階段關聯的事件是Validate,它有一個可以接受驗證字符串群的重載方法(overload method),這個重載方法執行特定控件群的驗證。

5. Event Handling

所有服務器端控件的事件處理發生在這個階段。也就是說Click, SelectedIndexChanged等等這些事件會應用到你的服務器端控件,如果是頁面請求是回傳(postback)的話,這些事件的處理函數就會被控件觸發。這個階段可以使用的事件如下:

LoadComplete – 在這個階段,頁面上所有的控件加載完畢 PreRender – 這里有幾個重點,第一:頁面對象(page object)會調用每一個控件的EnsureChildControls函數,并最終調用自己的。其次:所有具有DataSourceID的數據綁定控件都會調用自己的DataBind函數。要注意的一點是,PreRender事件會發生在一個頁面的每一個控件上。在這個事件的最后,頁面和所有控件的 ViewState被存儲。

SaveStateComplete – 到這里,ViewState已經存儲完畢,如果你有什么操作不需要修改控件但需要修改ViewState的,可以放在SaveStateComplete里面。

6. Render

渲染(Render)實際上不是一個事件,頁面對象調用每一個控件的Render方法從而按順序的輸出控件的HTML代碼。編寫用戶自定義控件的開發者對這個階段最感興趣了,因為輸出用戶自定義HTML代碼的標準做法就是重寫Render方法。如果你的控件是從ASP.NET服務器端控件繼承來的,你也許不需要重寫Render方法,除非你想呈現一個與用戶控件默認行為不同的行為。這些都超出這個文檔要討論的范圍了,如果想了解更多,請參考 Microsoft's Developing Custom ASP.NET Server Controls. ( http://msdn2.microsoft./zt27com/en-us/librarytfhy.aspx)

7. Unload

最后這個事件首先是被各個控件逐一觸發,最后被頁面觸發。在這個時刻,所有的控件已經被渲染為輸出流(output stream)并且無法被修改。這個階段中,任何試圖對response stream的操作都會引發異常。這個事件主要用于做一些清理工作,比如關閉數據庫連接和打開的文件或者登記事件記錄等等其它任務。

頁面周期中都有哪些方法

下面列出ASP.NET頁面生命周期中所有的方法,這些方法都可以被重寫(override),要注意的是這些方法有的會遞歸調用,有個會被頁面中的內容重復調用,這個列表是按照頁面加載時最通用的順序排列的。

  Construct

ProcessRequest

FrameworkInitialize

InitializeCulture

If child controls are present:

AddParsedSubObject

CreateControlCollection

AddedControl

ResolveAdapter

DeterminePostBackMode

OnPreInit

OnInit

TrackViewState

OnInitComplete

OnPreLoad

OnLoad

OnLoadComplete

EnsureChildControls

CreateChildControls

OnPreRender

OnPreRenderComplete

SaveViewState

OnSaveStateComplete

CreateHtmlTextWriter

RenderControl

Render

RenderChildren

VerifyRenderingInServerForm

OnUnload

Dispose

結論

在開發ASP.NET程序時,了解什么時候發生什么事情是非常重要的。理解頁面中事件是如何層層展開節省大量撓頭和查錯的時間。當這些頁面周期中的事件難以記住時,我希望這個使用的法子能幫助你梳理出在程序里哪個地方需要做什么處理。

我寫這篇文章是為了幫助大家,也方便了自己。即使是熟練的開發人員有時也會忘記那些先那些后。這篇文章不是面面俱到,而是希望給初學者和中級水平的開發者提供一些“小技巧”,從而幫助他們避免一些基本的錯誤

轉載于:https://www.cnblogs.com/tearer/archive/2012/05/22/2513106.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/379693.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/379693.shtml
英文地址,請注明出處:http://en.pswp.cn/news/379693.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

你正確關閉WCF鏈接了嗎?

通常情況下我們關閉一個WCF鏈接都是簡單地寫把ICommunicationObject.Close()方法,但是這個方法有個問題就是當調用發生異常時,Close()會發生次生的異常,導致鏈接不能正常關閉。如果當這種異常很多時,必然對系統的穩定性有很大的影…

Visual Studio進行linux遠程開發

目錄準備工作創建一個項目配置遠程項目準備工作 查看linux IP地址 安裝了工具 sudo apt-get install openssh-server g gdb make ninja-build rsync zip開啟ssh服務: sudo service ssh startVS2019按裝了linux功能,如果沒有,找到Visual S…

在給定總和K的二叉樹中找到級別

Description: 描述: The article describes how to find the level in a binary tree with given sum K? This is an interview coding problem came in Samsung, Microsoft. 本文介紹了如何在給定總和K下在二叉樹中找到級別 ? 這是一個面試編碼問題&a…

PostgreSQL學習手冊(數據庫維護) 轉

原文: PostgreSQL學習手冊(數據庫維護)一、恢復磁盤空間:在PostgreSQL中,使用delete和update語句刪除或更新的數據行并沒有被實際刪除,而只是在舊版本數據行的物理地址上將該行的狀態置為已刪除或已過期。因此當數據表中的數據變化…

++i與i++的根本性區別(兩個代碼對比搞定)

首先來看i 代碼如下&#xff1a; #include <stdio.h> #include <stdlib.h> int main() {int i0;int ai;printf("%d\n",a);printf("%d\n\n\n",i);return 0; }輸出結果如下&#xff1a; 解釋&#xff1a;i其實是兩行代碼的簡寫形式&#xff0c…

國企和外企的比較

由于本人在外企&#xff0c;而很多朋友在國企&#xff0c;因此我個人的說法應該還是有一定的權威性。 首先&#xff0c;國企和外企不能一概而論。正如任何事物都有三六九等&#xff0c;這個&#xff0c;只能在同等級別上進行比較。 國企分類&#xff1a; 一等國企&#xff1…

Python | 使用matplotlib.pyplot創建線圖

Problem statement: Write a program in python (using matplotlib.pyplot) to create a line plot. 問題陳述&#xff1a;用python編寫程序(使用matplotlib.pyplot)以創建線圖。 Program: 程序&#xff1a; import matplotlib.pyplot as pltx [1,2,3,4,5,6,7,8,9,10]y [3,…

QI(接口查詢)

接觸AE一段時間了&#xff0c;總的來說收獲不少&#xff0c;今天仔細分析了一下AE開發中經常會用到的QI即接口查詢&#xff0c;有了自己的一些理解。 COM類至少有一個接口。事實上一般它們有好幾個接口。即一個類經常會實現多個接口&#xff08;一個類無法繼承多個類&#xff0…

linux內核設計與實現---從內核出發

獲取、編譯、安裝內核1 獲取內核源碼安裝內核源代碼何處安裝源碼使用補丁2 內核源碼樹3 編譯內核減少編譯的垃圾信息衍生多個編譯作業安裝內核啟用指定內核作為引導4 內核開發的特點沒有libc庫頭文件沒有內存保護機制容積小而固定的棧1 獲取內核源碼 在linux內核官方網站http:…

MySQL在DOS下的基本命令操作

啟動net start mysql 重置root密碼 方法一:在my.ini的[mysqld]字段加入&#xff1a; skip-grant-tables 重啟mysql服務&#xff0c;這時的mysql不需要密碼即可登錄數據庫然后進入mysql mysql>use mysql;mysql>更新 user set passwordpassword(新密碼) WHERE Userroot; …

strlen的神奇實現

https://blog.delphij.net/2012/04/freebsd-strlen3.html 與 Pascal 等語言不同&#xff0c;C 的字符串并不保存串的長度&#xff0c;而是在字符串末尾以 nul 字符&#xff08;\0&#xff09;來表示字符串結束。這個設計決策是上世紀 60 年代作出的&#xff0c;有都市傳說是為了…

python求和_Python程序查找特殊求和系列的解決方案

python求和We are going to design a special sum series function which has following characteristics: 我們將設計一個特殊的求和系列函數&#xff0c;該函數具有以下特征&#xff1a; f(0) 0f(1) 1f(2) 1f(3) 0f(x) f(x-1) f(x-3)Python solution of the above sum…

linux內核設計與實現---進程管理

進程管理1 進程描述符及任務結構分配進程描述符進程描述符的存放進程狀態設置當前進程狀態進程上下文進程家族樹2 進程創建寫時拷貝fork()vfork()3 線程在Linux中的實現內核線程4 進程終結刪除進程描述符孤兒進程造成的進退微谷5 小結進程的另一個名字叫做任務&#xff08;task…

JS錯誤代碼解釋大全+VBS錯誤代碼解釋大全

JScript 運行時錯誤 JScript 運行時錯誤是指當 JScript 腳本試圖執行一個系統不能運行的動作時導致的錯誤。當正在運行腳本、計算變量表達式、或者正在動態分配內存時出現 JScript 運行時錯誤時。 錯誤號 描述 5029 數組長度必須為一有限正整數 5030 必須賦給數組長度一個有…

生日蠟燭(藍橋杯)

某君從某年開始每年都舉辦一次生日party&#xff0c;并且每次都要吹熄與年齡相同根數的蠟燭。 現在算起來&#xff0c;他一共吹熄了236根蠟燭。 請問&#xff0c;他從多少歲開始過生日party的&#xff1f; 請填寫他開始過生日party的年齡數。 注意&#xff1a;你提交的應該是…

python日歷模塊_Python日歷模塊| firstweekday()方法與示例

python日歷模塊Python calendar.firstweekday()方法 (Python calendar.firstweekday() Method) firstweekday() method is an inbuilt method of the calendar module in Python. It works on simple text calendars and returns the current setting for the weekday to start…

php 處理 mysql to json, 前臺js處理

public function GetJson(){$query"select * from table";$result mysql_query($query);$rows array();while($row mysql_fetch_array($result)){$rows [] $row;}echo json_encode($rows); } js處理 $.get( "./bll.php", option,function(data ) {var j…

Linux內核設計與實現---進程調度

進程調度1 策略I/O消耗型和處理器消耗型的進程進程優先級時間片進程搶占2 Linux調度算法可執行隊列優先級數組重新計算時間片schedule()計算優先級和時間片睡眠和喚醒負載平衡程序3 搶占和上下文切換用戶搶占內核搶占4 實時5 與調度相關的系統調用與調度策略和優先級相關的系統…

ServletContext(核心內容)

什么是ServletContext對象 ServletContext代表是一個web應用的環境&#xff08;上下文&#xff09;對象&#xff0c;ServletContext對象 內部封裝是該web應用的信息&#xff0c;ServletContext對象一個web應用只有一個 一個web應用有多個servlet對象 ServletContext對象的生…

【轉載】[TC]飛船動畫例子--《C高級實用程序設計》

【聲明和備注】本例子屬于轉載來源于《C高級實用程序設計》&#xff08;王士元&#xff0c;清華大學出版社&#xff09;第11章&#xff0c;菜單設計與動畫技術&#xff0c;第11.5節&#xff0c;一個動畫例子。 本例講解的是在一個繁星背景下&#xff0c;一個由經緯線組成的藍色…