理解asp.net頁面事件
一個ASP.NET頁面在運行時將經歷一個生命周期,在生命周期中將執行一系列處理步驟。這些步驟包括初始化、實例化控件、還原和維護狀態、運行事件處理程序代碼以及呈現頁面。在頁生命周期的每個階段中將引發一些事件,事件被引發時會運行程序員提供的事件處理代碼。頁面還支持自動事件連接,即ASP.NET將尋找具有特定名稱的方法,并在引發特定事件時自動運行這些方法。如果@Page指令的AutoEventWireup屬性設置為 true(若未定義該屬性則默認為 true),頁面事件將自動綁定至使用“Page_event”命名約定的方法,如 Page_Load 和 Page_Init。下表列出了主要的頁面生命周期事件。
頁 事 件 | 典 型 用 場 |
Page_PreInit | 使用IsPostBack屬性確定是否是第一次處理該頁;創建動態控件;動態設置Theme屬性;讀取或設置配置文件屬性值等 |
Page_Init | 讀取或初始化控件屬性 |
Page_Preload | 事件在所有回發數據處理之后但在 Load 事件之前引發 |
Page_Load | 讀取和更新控件屬性 |
Control events | 處理特定事件,如 Button 控件的 Click 事件 |
Page_PreRender | 對頁的內容進行最后更改 |
Page_Unload | 執行最后的清理工作,例如關閉打開的文件和數據庫連接等 |
以下代碼可以用于驗證這些事件的觸發順序:
代碼清單 6‑1
- protected void Page_Load(object sender, EventArgs e)
- {
- lbText.Text += "Page_Load <hr> ";
- }
- protected void Page_PreInit(object sender, EventArgs e)
- {
- lbText.Text += "Page_PreInit <hr>";
- }
- protected void Page_Init(object sender, EventArgs e)
- {
- lbText.Text += "Page_Init <hr>";
- }
- protected void Page_PreLoad(object sender, EventArgs e)
- {
- lbText.Text += "Page_PreLoad <hr>";
- }
- protected void Page_PreRender(object sender, EventArgs e)
- {
- lbText.Text += "Page_PreRender <hr>";
- }
lbText是在頁面頂端放置的一個Lable控件。運行后在瀏覽器中呈現如圖6-1所示的效果。
需要特別說明的是Page_Unload事件,它容易被誤解為關閉頁面時所觸發的事件。但是執行下面的代碼后就會發現其實不然。
代碼清單 6‑2
- protected void Page_Unload(object sender, EventArgs e)
- {
- System.Web.HttpContext.Current.Response.Write("<Script>alert('Page_Unload');</Script>");
- }
保存并運行頁面后就會發現,在頁面加載后就看到了圖6-2的效果。
頁面在請求完成后,就立刻觸發了該事件。關閉頁面是一個客戶端的事件,請不要與之混淆。此外,如果在Page_Unload中調用Response.Write方法,還會得到一個“響應在此上下文中不可用。”的錯誤警告。
了解了頁面事件的觸發順序,在實際網站的開發中,我們就可以根據需要在不同的事件發生時給出處理操作。