ASP.NET頁面事件:順序與回傳詳解

来源:http://www.cnblogs.com/roucheng/archive/2016/06/11/aspnetshijian.html
-Advertisement-
Play Games

當頁面被提交請求第一個方法永遠是構造函數。您可以在構造函數裡面初始一些自定義屬性或對象,不過這時候因為頁面還沒有被完全初始化所以多少會有些限制。特別地,您需要使用HttpContext對象。當前可以使用的對象包括QueryString, Form以及Cookies集合,還有Cache對象。註意:在構 ...


當頁面被提交請求第一個方法永遠是構造函數。您可以在構造函數裡面初始一些自定義屬性或對象,不過這時候因為頁面還沒有被完全初始化所以多少會有些限制。特別地,您需要使用HttpContext對象。當前可以使用的對象包括QueryString, Form以及Cookies集合,還有Cache對象。註意:在構造函數里是不允許使用Session的。

  下一個將執行的方法是AddParsedSubObject方法,這個方法將添加所有獨立的控制項並把頁面組成一個控制項集合樹,這個方法經常被一些高級的頁面模板解決方案(Page Template Solutions)重寫以便添加頁面內容到頁面模板(Page Template)中一些特殊的控制項中。這個方法遞歸應用到所有的頁面控制項及相應的的每個子控制項,所有的控制項都是在這個方法中開始最早的初始化。http://hovertree.com/menu/aspnet/

  頁面類中下一個將執行的方法是DeterminePostBackMode。這個方法允許您修改IsPostBack的值及相關的事件。如果您需要從資料庫中載入ViewState這個方法將特別有用,因為ViewState只有在IsPostBack為真的情況下才會進行恢復。返回空將會導致強制執行非回傳,返回Request.Form則強制執行一個回傳。除非在特殊情況下,否則並不建議去操作這個,因為這個還會影響其他的事件。

  下一個將要執行的方法是OnInit方法,一般這是第一個真正被使用的方法。這個方法觸發時,所有頁面定義中的控制項執行初始化,這意味著所有在頁面中定義的值應用到相應的控制項上。不過,ViewState和傳回的值還不會應用到控制項上,因此,任何被代碼或用戶改變的值還沒有被恢復到控制項上。這個方法通常是最好的創建、重創建動態控制項的好地方。

  二、恢復及載入

  下一個方法,LoadPageStateFromPersistenceMedium只會在頁面被回傳的時候才會被執行。如果因為使用Session或自定義存儲方式,您修改了後面將要提到的影響ViewState保存方式的方法SavePageStateToPersistenceMedium,則這個方法需要被重寫。預設的實現中ViewState是一種Base64格式編碼,並且被保存在頁面的隱藏域中,您可以使用這篇文章中提及的方法修改ViewState按以上兩種方式保存。註意:這個方法並沒有真正載入ViewState到頁面或頁面控制項中。

  當得到ViewState後,下一個方法LoadViewSate,將以遞歸的方式恢復ViewState到頁面及各個頁面控制項或子控制項中。這個方法執行後,每個控制項都將恢復到上一次的狀態,但是用戶提交的數據還沒有應用到控制項上,因為他們不是ViewState的一部分。這個方法主要用於恢復您在其他事件中動態生成的控制項的值,他們的值是您手動保存在ViewSate中,並且現在已經失效。

  下一個方法是ProcessPostData,這個方法也同樣是回傳的時候才會被執行,並且不允許被重寫,這個是頁面基類的私有方法。這個方法通過匹配控制項的名稱恢復相應的用戶提交的控制項的值,到這一步意味著整個頁面都已經被完全恢復了。唯一要記住的是所有動態控制項的創建必須在這個方法之前。這個方法也是記錄後面的改變事件的方法。

  下一個方法是OnLoad方法,通常這是用得最多的方法,因為這個方法是頁面生存期第一個恢復了所有值的地方。大多數代碼根據判斷IsPostBack來決定是否重新設置控制項狀態。您也可以在這個方法中調用Validate並且檢查IsValid的值。也可以在這個方法中創建動態控制項,並且該控制項的所有的方法都會被執行以追上當前頁面的狀態包括ViewSate,不過不包括回傳的值。

  三、事件處理

  下一個方法還是ProcessPostData,實際上就是前一個方法的另一次調用,它仍然是只在回傳的時候執行並且由於是私有方法不可以被重寫。如果您是第一次看頁面的運行軌跡也許會覺得這個方法有些多餘。但實際上這個方法是必要的因為在OnLoad中創建的動態控制項也需要他們回傳的值。任何在這以後創建的控制項將可以得到他們的ViewState,但是不能再得到他們的回傳的值,並且不會觸發任何值改變事件(Change Event)。

  下一個方法,RaiseChangedEvents,也是只在回傳頁面中執行,並且也因為是基類的私有方法所有不能被繼承。在整個頁面生存期中,是在這兒根據之前的ProcessPostData記錄的控制項的值和提交的值是否不同來觸發值改變事件。您也許需要調用Validate或者檢查IsValid的值。這裡並沒有特別的說明多個值改變事件的執行先後順序。

  下一個方法,RaisePostBackEvent,同樣是因為是基類的私有方法不能被繼承,同樣也是只在回傳頁面中執行。除非使用了AutoPostBack,不然這是實際提交表單事件執行的地方,特別是按鈕或者其實使用JavaScript提交表單等。如果還沒有被手動調用過並且使用了驗證控制項,那麼Validate會被調用。註意IE中有個BUG有時會允許提交但卻不觸發任何事件。

  下一個方法是OnPreRender,一般這是在客戶端展現頁面之前改變頁面及其控制項的最後一次機會。您也可以在這個方法裡面創建動態控制項,並且所有的方法都會被執行以追上當前頁面的狀態包括ViewSate,但是私有方法將不會被執行,這意味著不會有回傳的值並且不會有事件觸發。由於IE中的BUG,這是一個沒有事件趕上PostBack的好地方。

推薦:http://www.cnblogs.com/roucheng/p/netkuangjia.html


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

-Advertisement-
Play Games
更多相關文章
  • 為了適應應對各種資料庫間切換,我們有時想要要自定義寫一個通用的SqlHelper。常用的做法就是在 System.Data.Common.DbProviderFactories.GetFactory(dbProviderName).CreateConnection() ,來返回對應的 資料庫的Con ...
  • 當IE瀏覽器遇到腳本錯誤時,在瀏覽器左下角會出現一個黃色圖標,點擊可以查看腳本錯誤的詳細信息,並不會有彈出的錯誤信息框。我們在用webBrowser編寫的程式打開網頁,遇到腳本有問題是,會彈出一個錯誤提示框,需要確認後才能夠進行執行。如果我們設計的程式是用來自動處理網頁的,那麼在出現這種情況時,程式 ...
  • 字母轉換成數字 byte[] array = new byte[1]; //定義一組數組array array = System.Text.Encoding.ASCII.GetBytes(string); //string轉換的字母 int asciicode = (short)(array[0]) ...
  • 變數定義中類型後帶一個問號,意思是這個數據類型是NullAble類型的。用於給變數設初值的時候,給變數(int類型)賦值為null,而不是0!例子: int? i = 3 等同於Nullable<int> i = new Nullable<int>(3);int?是泛型Nullable<int>的另 ...
  • 引言: 本人想自己個博客網站出來,技術路線是用ASN.NET MVC5+EF6(Code First)+ZUI+各種Jquery插件,有了這個想法之後就開始選擇UI,看了好多bootstrap的模板之後,發現即使你用了bootstrap還是要自己寫css樣式,都是自學的,前端真的很垃圾,在網上找了很... ...
  • 之前在http://www.cnblogs.com/JsonZhangAA/p/5568575.html博文中是利用的image控制項來顯示的二進位流圖片,我現在想的是能 通過普通的<img id="xx" src="xx"/>這種形式來顯示我的二進位流圖片嗎?必須可以(◑▽◐),就是寫法稍微麻煩了一 ...
  • 推薦:http://www.cnblogs.com/roucheng/p/3521864.html ...
  • 在瞭解HTTP斷點續傳的原理之前,先來說說HTTP協議,HTTP協議是一種基於tcp的簡單協議,分為請求和回覆兩種。請求協議是由客戶機(瀏覽器)向伺服器(WEB SERVER)提交請求時發送報文的協議。回覆協議是由伺服器(web server),向客戶機(瀏覽器)回覆報文時的協議。請求和回覆協議都由 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...