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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...