最近,正在學習ASP.NET服務器控件封裝相關的知識,把自己學到的和大家分 享下。
本次內容的概要如下:
1.事件以及為什麼需要事件驅動機制;
2.回發的原理;
3.異步回調的原理;
4.事件回發的實現;
5.異步回調的實現。
了解了本次內容的概要,接下來就分節次說明了。
1.事件以及為什麼需要事件驅動機制
在C#語言詳解一書中對事件的定義是“事件是一種使對象或類能夠提供通知的 成員”,在這裡換句話 說就是頁面中已注冊事件的對象能夠對用戶的操作進行捕獲並處理。那麼為什麼 需要引用事件機制呢?
大家都知道,如果在類A的實例對象中創建了一個類B的實例對象,那麼在類A 的實例對象中就可以通 過該類B的實例對象調用類B公開的任何方法和屬性等。就像用戶Page對象中包含 了創建了一個TextBox對 象,Page對象就可以通過TextBox對象去調用Text屬性。但是如果需要在上述的 TextBox對象中調用Page 對象中的某些屬性或方法又該怎樣處理呢?顯然包含調用就行不通了,事件機制 正好解決該問題。
現就TextBox的TextChanged事件來描述下。
首先需要在TextBox中聲明TextChanged委托,並通過頁面注冊將該委托和頁面 類處理事件函數關聯起 來
<asp:TextBox ID="TextBox1" runat="server" OnTextChanged="TextBox1_TextChanged"></asp:TextBox>
(上述代碼就是將TextBox1的TextChanged事件注冊到頁面類中)。
然後在TextBox類體內調用TextChanged委托關聯的事件函數就可以了。這樣, 當頁面類對象中 TextBox控件的Text發生改變時TextBox首先執行完自己內部邏輯處理後,就會調 用頁面類中 OnTextChanged事件函數TextBox1_TextChanged(),而TextBox1_TextChanged()函 數是頁面類中的一個方 法,所以TextBox就可以在該函數內調用頁面類中的其他方法和屬性了。(當然也 是可以調用TextBox1自 己的)。
2.回發的原理
Web開發的人員都知道,客戶端回發到服務端的事件只有一個,那麼在服務端 怎樣的區分用戶執行了 怎樣的操作呢?這裡首先從ASP.NET的頁面請求說起了。
在ASP.NET中處理頁面時,前後兩個頁面之間是無狀態連接的,也就是說客戶 端的前後兩次請求是相 互獨立的,服務端不會保存前一次請求的頁面狀態。如此就引入了視圖狀態機制 (我會在以後的文章中 和大家分享下ASP.NET開發的視圖狀態和控件狀態機制的研究樂趣)來處理前後兩 次請求的邏輯處理,其 原理就是在前一次請求發生後服務端將頁面的邏輯信息保存在一個隱藏的字段中 回送到客戶端,當後一 次請求發生時服務端首先取出該隱藏字段中的值並恢復到各個視圖控件中,等邏 輯處理完後再將新的數 據保存到該隱藏字段會送到客戶端,從而延續了兩次頁面之間的狀態信息。
本文中要說明的回發就是在視圖狀態機制基礎上完成的,也就是通過比較發送 到服務端的控件當前值 和保存在隱藏字段中的舊值,從而決定是否觸發哪些事件。當然,自定義的控件 類必須通過繼承 IPostBackDataHander接口來完成事件的回發功能。