熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

ASP.NET 中的自定義腳本回調

2013-11-13 10:05:16  來源: .NET編程 

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