ASP
NET 客戶端回調代表著一種簡潔而絕佳的方法
它可以在不發布和刷新當前頁的情況下執行服務器端代碼
我在
年
月和
月的 Cutting Edge 專欄中討論了 ASP
NET 回調
當時是從對服務器進行後台回調
向相關頁發送輸入數據以及接收響應的呈現頁的角度對它們進行了討論
然後
響應字符串由合適的客戶端進行處理
並且通常通過動態 HTML (DHTML) 對象模型和嵌入到頁面中的回調 JavaScript 函數來操作呈現的頁面內容
盡管回調的這種用法已經讓人非常激動了
但它們還可以執行更多的任務
腳本回調機制也可以為服務器控件添加高級功能
通過實現幾個接口
任何自定義控件都會被賦予腳本回調功能
以便使用後台往返來收集服務器數據以及更新用戶界面 — 這就是本月我要講述的主題
受 GridView 控件的啟發 如果您讀過我最近寫的一篇功能文章 ASP
NET
GridView
您就會了解 GridView 控件無需刷新整個頁面就可以顯示新的記錄頁
實際上
GridView 控件提供了一個基於 ASP
NET 腳本回調進行分頁和排序的高級引擎
新頁面的數據是在後台下載的
用戶看不到
在數據到達客戶端之後
這些數據將立即由 JavaScript 函數收集
並用於更新當前視圖
分頁和排序回調並不是
% 的客戶端回調解決方案(如果您需要一個純粹的客戶端實現
請參閱
年
月 Jeff Prosise 在 Wicked Code 專欄中發表的文章)
GridView 的分頁和排序回調是按需工作的
它只下載需要的數據
而不會將整個數據源都下載到客戶端上
您仍然要付出一個往返的代價
但是能夠保證得到最新的數據
即使這些數據最近已經在服務器上更新過
自從發現 ASP
NET 控件可以支持腳本回調功能之後
我感到非常興奮
同時也促使我趕緊找出構建自己的腳本回調的方法
順便提一句
GridView 並不是唯一一個支持類似功能的 ASP
NET
控件
其他視圖控件(如 TreeView
DetailsView 和 FormView)也能以其他方式提供相同的功能
作為使用具有回調功能控件的開發人員
您不需要處理服務器端代碼
也不用擔心編寫以及在宿主頁中嵌入 JavaScript 代碼的問題
該控件可以完成一切操作
它展示了一個直觀的編程模型
您可以通過該模型控制腳本回調機制
控件腳本回調基本知識 ASP
NET 腳本回調機制由兩個關鍵元素組成
響應用戶操作的服務器端代碼
以及客戶端上處理服務器端事件所生成結果的 JavaScript 回調代碼
在頁面回調自身的情況下
正如我在前面提到的文章中所述的那樣
您可以在執行對用戶不可見的回發的頁面按鈕中附加一些 ASP
NET 生成的腳本代碼
因為該請求的目標是當前頁
所以該頁會發布到自身
這與它在一個普通回發事件中的行為方式相似
只是頁面的生命周期縮短了
該頁必須實現 ICallbackEventHandler 接口
以便可以調用一個具有預定義簽名的方法
來為客戶端生成結果
那麼
當控件觸發帶外調用時
該方案又有什麼不同呢?在這種情況下
不可見
回發的目標 URL 是承載該調用方控件的頁面的 URL
該控件必須實現 ICallbackEventHandler 才能提供為客戶端生成某些結果的方法
同樣
該控件負責在承載頁中插入處理結果和刷新該頁所需的任何 JavaScript 代碼
具有回調功能的控件只是一個實現 ICallbackContainer 和 ICallbackEventHandler 接口的控件
兩個接口都各有一個方法
ICallbackContainer 接口具有的方法可以返回觸發遠程調用的腳本代碼
ICallbackEventHandler 接口則提供了在調用期間執行的服務器端代碼
ICallbackEventHandler 也是一個具有回調功能的頁面必須實現的接口
一個實現回調接口的自定義控件示例的聲明如下面的代碼所示
public class CallbackValidator : WebControl
INamingContainer
ICallbackContainer
ICallbackEventHandler
在 ICallbackContainer 接口的實現中
您可能需要放入一個對該頁 GetCallbackEventReference 方法的調用
以獲得一個可啟動服務器事件的正確 JavaScript 調用
稍後我再講述這些內容
CallbackValidator 控件 為了解具有回調功能的服務器控件
我們來看一個具有 ASP
NET 腳本回調功能的自定義驗證器控件示例
在 ASP
NET 中
驗證控件用於檢查並驗證網頁中定義的窗體域的輸入
驗證器是一個服務器控件
它是從 BaseValidator 類繼承的
而該類又是從 Label 繼承的
每個驗證控件都引用一個位於該頁其他位置的輸入控件
當頁面要提交時
任何受監視服務器控件的內容都會傳遞到該驗證器
以進行進一步處理
每個驗證器都執行一種不同類型的驗證
例如
CompareValidator 控件使用比較運算符(如小於
等於或大於)將用戶的輸入與一個固定值進行比較
RangeValidator 確保用戶輸入位於某個指定范圍內
而 RegularExpressionValidator 只在匹配某個常規表達式定義的模式時才驗證用戶輸入
通常
驗證都在服務器上發生
然而 ASP
NET 還為大多數驗證控件提供了一個完整的客戶端實現
並允許用戶為其余驗證控件編寫自定義客戶端腳本
這就使得具有 DHTML 功能的浏覽器(如 Microsoft?Internet Explorer
和更高版本)在用戶點擊或單擊受監視輸入域之外的位置後
能夠立即在客戶端上執行驗證
在很多情況下
客戶端驗證足夠強大
可以檢測出許多重大錯誤並通知用戶
例如
RequiredFieldValidator 控件可驗證給定域不能保留為空
無需回發到服務器即可驗證當前值
如果客戶端驗證打開
則在所有輸入域均包含有效數據之前
該頁不會回發
為了運行安全代碼
以及防止惡意和秘密的攻擊
您還是應該在服務器上驗證數據
服務器端驗證始終由驗證器控件執行
即使同時要執行客戶端驗證也是如此
另外
並非所有類型的驗證都能在客戶端上完成
實際上
如果您需要針對數據庫進行驗證
則沒有別的選擇
只能回發到服務器
而這也正是發生問題的地方
常規回發涉及整個頁面
上載整個視圖狀態
處理整個頁面
生成
下載和呈現同樣的大型響應
如果您能夠向服務器發出經過優化的帶外請求
並只檢查驗證之下的控件的狀態
那豈不是很好?
在 ASP
NET 中
沒有這樣的控件
那麼我們就來編寫一個這樣的控件吧
我將其命名為 CallbackValidator
CallbackValidator 是一個自定義 ASP
NET
控件
我構建這個控件的目的是為了演示控件可以如何實現對承載頁的帶外調用
以及如何在服務器上自行處理事件
在我開始著手此項目時
實際上並沒有如此雄心勃勃的目標
我原先的目標只是修改 CustomValidator 標准控件
對於該記錄
CustomValidator 控件采用了以編程方式定義的驗證邏輯來檢查用戶輸入的有效性
如果預先不知道要檢查的值
則應該使用此方法
CallbackValidator 控件的最初意圖是提供一種方法
以便在不回發整個頁面的情況下執行服務器端驗證
我意識到無需太多的額外努力
就可以擁有一個類似於自定義按鈕的控件
這個控件可以在不回發整個頁面的情況下在服務器上對許多輸入域進行驗證
而此時我的修改工作已經完成了一半
這個行為就是 CallbackValidator 控件的全部
在我深入講述該控件的精髓之前
我們先來看一下圖
該頁面上的 Submit 按鈕只會按照普通的方式將所有值發布到服務器上
實際上
這些值將在客戶端上進行處理
如果所有這些值都需要傳遞
那麼該控件就會將其傳遞到服務器上
在該服務器上
所有控件輸入都將使用服務器端驗證代碼(如果有的話)進行驗證
Validate 按鈕會觸發一個對 Web 服務器的帶外調用
並只驗證指定的輸入控件
在它返回時
您就會知道哪些值已經通過了服務器的驗證
例如
在圖
中
您將在嘗試提交其余數據之前了解到是否已經采用了該用戶 ID
圖 帶有具有回調功能驗證的輸入窗體 圖
顯示了該頁面的源代碼
正如您可以看到的那樣
它包含了一個 HTML 服務器窗體
一些文本框(每個文本框都綁定到一個標准的驗證控件)以及該自定義 CallbackValidator 控件的一個實例
此控件實際上負責創建並顯示 Validate 按鈕
該控件如何工作 該 CallbackValidator 控件從 WebControl 繼承
並實現了 INamingContainer 接口
另外
它還實現了 ICallbackContainer 和 ICallbackEventHandler 接口
以便獲得回調支持
ICallbackContainer 接口需要方法 GetCallbackScript 按照下列方式聲明
string GetCallbackScript(IButtonControl buttonControl
string argument)
GetCallbackScript 采用兩個參數
第一個是對預期要觸發回調的頁面控件的引用
第二個參數(字符串)表示調用方希望傳遞給方法以幫助構建輸出的任何上下文
從名稱可以看出
GetCallbackScript 方法使用 JavaScript 函數調用來准備和返回字符串
以便附加到指定的按鈕控件來觸發遠程調用
該按鈕控件參數使您能夠精確地指定要對控件 UI 中的哪個按鈕進行 JavaScript 調用
該示例 CallbackValidator 控件只有一個可單擊按鈕
而 GridView 控件則具有很多可單擊按鈕
每個按鈕都用於頁導航或標頭中的一個鏈接按鈕
在 ASP
NET
中
所有充當窗體中按鈕角色的控件都需要實現一個新的接口 — IButtonControl
該接口在
From:http://tw.wingwit.com/Article/program/net/201311/12523.html