ASP.net 頁面生命周期

来源:http://www.cnblogs.com/Aaxuan/archive/2016/12/24/6201656.html
-Advertisement-
Play Games

ASP.NET 頁面生命周期 Page_Preinit(); 在頁初始化開始時發生 Page_Init(); 在所有控制項初始化且應用外觀設置後引發 Page_InitComplete(); 在頁初始化完成時發生 Load ViewState and Postback data; //載入視圖和回傳數 ...


 

ASP.NET 頁面生命周期

 

Page_Preinit();    在頁初始化開始時發生

Page_Init();    在所有控制項初始化且應用外觀設置後引發

Page_InitComplete();    在頁初始化完成時發生

Load ViewState and Postback data;    //載入視圖和回傳數據

Page_Preload();    在load事件之前發生

Page_Load();    伺服器控制項載入到page對象時發生

LoadCompleteLoadComplete();    在所有回發數據和視圖狀態數據都載入到頁以及頁上的所有控制項中後發生

Handle control events;    //處理控制項事件

Page_PreRender();    在載入Control對象後,呈現之前發生

Page_Render();    Render 方法負責創建的文本和發送到客戶端瀏覽器的標記。

Unload event;    當伺服器控制項從記憶體中卸載時發生,該事件先針對每個控制項然後針對整頁

Dispose method called;

 


asp.net頁面生命周期

--------------------------------------------------------------------------------

頁面執行是從FrameworkInitialize方法開始的,這個方法為頁面構建控制項樹。該方法是TemplageControl類的受保護並且是虛方法。任何為aspx資源動態生成的句柄覆蓋了該方法。在這個方法里,頁面的所有控制項樹都被構建了。

  接下來,ProcessRequest方法使頁面經歷了不同的幾個階段:初始化、載入視圖狀態信息、回傳數據、載入頁面代碼和執行回傳的伺服器事件。在這之後,頁面轉換到了顯示模式:收集被更新的視圖狀態;產生HTML代碼,並且傳送到控制台。最後,頁面卸載,請求的全部服務結束了。

  在各個不同階段里,頁面處理了與web控制項相關、程式員代碼能夠干預並解決一定問題的事件。其間一些事件是專門為那些內嵌控制項和不能在.aspx代碼級別處理的控制項而設計的。

  一個頁面要解決這樣的事件,它能明確的註冊成為合適的句柄。但是,為了和原有的Visual Basic編程模式有後向相容性,ASP.NET也支持了隱含事件的形式。在預設情況下,頁面會尋找和事件相關的方法名;如果找到和事件相匹配的方法,這個方法就被認為是這種事件的處理程式。ASP.NET提供了六種專門的方法名,他們是 Page_Init , Page_Load , Page_DataBind , Page_PreRender 和 Page_Unload 。這些方法這些方法在Page類中已經被定義過,他們是相應事件的處理程式。HTTP運行時將自動的將這些方法綁定到相關的頁面事件,而不需要程式員去編寫把事件和方法聯繫起來的代碼。舉個例子來說,在下麵的代碼中, Page_Load方法和頁面的載入事件相關聯:

this.Load + = new EventHandler(this.Page_Load);

  這種自動識別是被 @Page 預指令的AutoEventWireup 屬性控制的。如果這個屬性被置false ,應用程式必須顯式聲明和事件相關的方法。不自動關聯頁面事件代碼的頁面執行起來會快一些,是因為他們不需要在匹配上做過多的工作。在Visual Studio.NET 工程里可以把這個屬性關閉掉。但是,預設設置是true,這意味著Page_Load方法被自動識別並被關聯到相關的事件。

  頁面執行包含了下表中按順序列出的幾個階段,他們被標誌成為應用程式級別的事件,同時也可能是一些受保護、重定義的方法:

階段 頁面事件 可重定義的方法

頁面初始化 Init

視圖狀態載入 LoadViewState

回傳數據處理 控制項里實現了IPostBackDataHandler介面的LoadPostData方法

頁面載入 Load

回傳數據變化檢查 控制項里實現了IPostBackDataHandler介面的RaisePostDataChangedEvent方法

回傳事件處理 控制項里定義的回傳事件 控制項里實現了IPostBackEventHandler介面的RaisePostBackEvent方法

頁面預返回階段 PreRender

頁面返回階段 Render

頁面卸載階段 Unload
  
  上表中列出的階段有的在頁面級別是不可見的,他們只是在伺服器控制項的作者編寫繼承於Page的類時會使用到。Init , Load , PreRender , Unload,再加上定義在內嵌控制項中的回傳處理事件,他們構成了頁面的整個生命周期。

  各個階段的執行

  頁面生命周期的第一階段是初始化。這個階段被Init事件所描述,這個事件在控制項樹被構建出來後執行。換句話說,當Init事件發生時,所有在.aspx文件中靜態聲明的控制項被實例化並被賦予了預設值。在Init事件中可以初始化任何的在頁面生命周期里需要的設置。例如:在這個階段,控制項可以載入外部的摸版文件或者是為事件建立處理句柄。需要註意的是,任何的視圖狀態信息在這個階段里是不能用的。

  緊接著初始化結束後,頁面構架為頁面載入視圖狀態。視圖狀態是 名稱/值 對的集合,控制項或頁面在這裡保存的數據在整個web請求過程中必須是穩固的。視圖狀態代表著頁面的上下文。典型的,它保存著頁面上次在伺服器上被執行時控制項的狀態。視圖狀態在會話開始的第一個頁面請求時是空的。在預設情況下,試圖狀態被保存在一個隱藏域里,這個隱藏域是被自動添加到頁面里的。這個隱藏域的名稱是 __VIEWSTATE。如果覆蓋了LoadViewState方法——在Control類里被聲明為受保護的方法——組件開發者可以控制視圖狀態的保存和它是如何和內部狀態形成映射。

  象LoadPageStateFormPersistenceMedium這樣的方法和與其相對應的SavePageStateToPersistenceMedium方法可以用來載入或者保存視圖狀態到其他的存儲中介里,例如:會話、資料庫或者是伺服器上的文件。和LoadViewState方法不相同的是,上面提到的方法只能在Page的繼承類里使用。

  一旦視圖狀態載入完畢了,頁面里的控制項被賦予了和上一次發送到瀏覽器時一樣的狀態。下一個階段是將他們更新,使之與伺服器端發生的變化相一致。在回傳數據處理階段,控制項更新他們的狀態,使之和客戶端的HTML元素的狀態相一致。例如,伺服器控制項TextBox有和它相對應的HTML控制項<input type=text>。在回傳數據階段,TextBox控制項將得到<input>標簽的值,並且用他來更新他的內部狀態。每一個控制項都可以從回傳數據中取得自己數據的能力,並且把自己的狀態更新。TextBox控制項將更新它的Text屬性,同樣的,CheckBox控制項也會將他們的Checked屬性刷新。伺服器控制項和HTML元素的匹配是通過兩者的ID來進行的。

  在回傳數據處理的最後階段,所有的頁面控制項反映了上一個被更新的狀態,這些都是由於客戶端的輸入變化所引起的。接下來,Load事件將被頁面執行。

  有一些控制項,在兩次請求中如果某些敏感屬性發生了變化,他們需要對此作出響應,並且完成一定的任務。例如,如果客戶端的textbox控制項的文本發生變化,這個控制項就激發了TextChanged事件。根據自客戶端的數據,如果控制項的一個或多個屬性發生了變化,每一個控制項都可以精確的激發合適的事件來處理。這些控制項實現了IPostBackDataHandler介面,這個介面中的LoadPostData方法在Load事件之後就被執行了。通過重定義LoadPostData方法,控制項可以驗證兩次請求中發生的變化並且激起相關的事件處理程式。

  在一個頁面周期中的關鍵事件是那些由客戶端事件激發在伺服器執行一段代碼的事件。例如,當用戶點擊一個按鈕,頁面就需要回傳。這個事件的處理是從按鈕ID和值的收集開始的。如果控制項是實現了IPostBackEventHandler介面(Button和LinkButton就是這樣的情況),頁面構架將調用RaisePostBackEvent方法。這個方法的具體情況是取決於控制項的類型的。在上面提到的Button和LinkButton控制項,這個方法就將尋找Click事件處理程式。

  處理了回傳事件之後,頁面就準備被髮送出去了。這個階段是從PreRender事件開始的。這對於控制項來說,那些需要在視圖信息被保存與結果被髮送之前這段時間里執行的動作,這是一個很好的時機。下一步就是SaveViewState ,所有的空間和頁面本身就把視圖狀態的集合內容保存起來。接下來,視圖狀態被串列化、哈希編碼、Base64 編碼,並且保存在__VIEWSTATE隱藏域里。

  各個控制項的發送機制可以通過重定義Render方法來改變。這個方法構建了一個HTML writer對象,用它來為控制項產生HTML代碼。對Page類里Render方法的預設執行包含了對所有成員控制項的遞歸調用。頁面為每一個控制項調用一次Render方法,並緩衝HTML輸出。

  頁面生命周期的最後階段是卸載事件,這個事件在頁面對象消失前被激發。在這個事件里,你應該把任何臨界資源釋放掉(例如:文件、圖形對象、資料庫連接)。

  最後,瀏覽器接收到了HTTP響應,並且把頁面顯示出來。

 

 

 

博客園chunchill博主的文章詳細講解了每個階段的工作:http://www.cnblogs.com/shineqiujuan/archive/2008/09/22/1295845.html

另附上MSDN官方文檔: https://msdn.microsoft.com/zh-cn/library/ms178472.aspx

 

本文參考 CSDN知識庫 http://lib.csdn.net/article/dotnet/53573

 

轉載請標明鏈接


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.SDR兩個缺口,單面84針角,雙面168針腳,電壓3.3v 記憶體顆粒長方形(已淘汰) 2.DDR1(第一代) 一個缺口,單面92針腳,雙面184針腳,電壓2.5v ,記憶體顆粒長方形 工作頻率:266,333,400 3.DDR2(第二代) 一個缺口,單面120針腳,雙面240針腳,電壓1.8v, ...
  • tar命令用與對文件打包壓縮或解壓,格式: tar [選項] [文件] 打包並壓縮文件: tar -czvf 壓縮包名 .tar.gz 解壓並展開壓縮包: tar -xzvf 壓縮包名 .tar.gz 參數 -c 創建壓縮文件; -x 解開壓縮文件; -t 查看壓縮包內有哪些壓縮文件; -z 用Gz ...
  • vi /etc/sudoers , 為apache用戶賦予root許可權,並且不需要密碼,還有一步重要的修改(我被困擾的就是這個地方) root ALL=(ALL) ALL apache ALL=(ALL) NOPASSWD:ALL 還有一個地方需要註釋掉 #Defaults requiretty ...
  • #!/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin HTMLFILE=/home/oldboy/html HTTP=http://oldboy.blog.51cto.com/all/2561410 N ...
  • [root@localhost tmp]# umask 0022 一、chattr用法 1、創建空文件attrtest,然後刪除,提示無法刪除,因為有隱藏文件 [root@localhost tmp]# cd /tmp [root@localhost tmp]# touch attrtest[roo ...
  • C# 6.0 的知識梳理 序 目前最新的版本是 C# 7.0,VS 的最新版本為 Visual Studio 2017 RC,兩者都尚未進入正式階段。C# 6.0 雖說出了一段時間,但是似乎有許多園友對這一塊知識並不瞭解,如拼接字元串的 $ 符號,在此,小人獻上拙作一篇《C# 6.0 的知識梳理》, ...
  • 遇到問題 core的版本從1.0升級到1.1,操作mysql資料庫,查詢數據時遇到MissingMethodException問題,更新、插入操作沒有問題。 如果你也遇到這個問題,請參照以下步驟進行升級操作。 操作步驟及內容 如果你的項目已經引用過以下幾部分內容,請依次升級內容: 如果你還沒有安裝過 ...
  • out、ref、params out: 如果你在一個方法中,返回多個相同類型的值的時候,可以考慮返回一個數組。 但是,如果返回多個不同類型的值的時候,返回數組就不行了,那麼這個時候, 我們可以考慮使用out參數。 out參數就側重於在一個方法中可以返回多個不同類型的值。參數必須在方法中對其完成初始化 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...