Whidbey中客戶端回調機制(一)
2024-07-21 02:16:27
供稿:網友
 
whidbey對客戶端回調的簡化
有很多理由讓我期待vs.net的下一個版本:whidbey,其中之一就是增加了很多對客戶端腳本的支持。包含了新的屬性和一個clientscriptmanager類來管理客戶端腳本。然而,也許最受歡迎的就是whidbey支持回調遠程服務器正在使用的客戶端腳本。
 
 
 
 
 
 
圖 1. 回調的流程: 當它被服務器和客戶端兩者處理時,你可以控制回調的流程
 
 
 
 
 
 
 
通過刷新或回發提交一個頁面來實現數據查詢是一項很平常的技術。使用asp時,開發者使用腳本來控制客戶端提交的數據,但這樣通常使得asp代碼很難進行維護。像大多數的web applications,對服務器以提交回發形式提交數據引起一個完全的請求- 回應周期,服務器會生成一個完全新的頁來回應請求, 然后瀏覽器會生成新的頁以代替已存在的頁。頁面重繪(page-redrawing)使得使用者得到服務器的回應的數度變得很慢。開發者減輕這種問題的接口問題的一個方法是藉由使用遠程腳本(remote scripting),這種遠程腳本使用包含java applets 的dhtml組合在已存在的頁面上動態生成向服務器更新數據的請求。
 除此之外,開發者還可以使用(只適用于ie請求)客戶端腳本和xmlhttp向服務器后臺數據發出請求。
但是這兩個方法的實現時很困難的,這需要非常的細心和努力,尤其是編譯。
開發者期待在最初asp.net release 版本中得到一些變化,他們得到一些,如: 服務器控件、 viewstate,自動回發(automated postback)以及基于事件的asp.net編程模型解決了許多問題。尤其是smartnavigation(僅僅在ie應用程序里)。 但是為了實現跨平臺應用程序,開發者繼續依賴遠程腳本。這個問題,在asp.net v2.0( whidbey) 里已經得到根本的改變。
 
whidbey 對客戶回調的支持
 
在whidbey 版本中,客戶端可以調用服務器方法來提交數據,并且得到結果,而不用提交表單。這些調用你只要寫很少的一些特別的代碼,使用后臺的xml http 來實現對服務器請求。 
 
圖一 顯示應用程序邏輯流程。 
你寫了一個對服務器發出請求的客戶端函數(步驟2),并且定義了一個服務器事件(步驟1 c) 處理這個請求。 callbackmanager 就像是一個中轉站,處理步驟3到步驟6的一系列過程。包括從客戶端到服務器的請求的發出和數據從服務器到客戶端的返回。 
另一個客戶端函數(步驟7) 處理服務器的返回信息。你寫了兩個客戶端函數用來想服務器發出一個請求并且處理服務器的返回信息。
 
實現查詢
假定你需要建立一個頁面來實現從3 張數據庫表中查詢數據:region, country, and city。 ( 見圖 2 ) 
 
這是一個" dependent list " 問題的典型的例子。 當一個用戶選擇一個地區,則程序應當用在這個地區的國家來綁定country list。 同樣,當用戶選擇一個國家時,city list應該為僅僅包含被選擇的國家相應的城市。( 見圖 2) 
當然可以使用正常postback 技術來實現這寫功能,但是你必須忍受每次向服務器發出請求而重繪整個頁面的性能代價。然而,因為你能維護全部頁布局代碼,因此你可以提供一種更好、更快的方法來實現這個功能,這就是使用遠程回調(remote callbacks),每次只發送相應的標識并且僅僅得到那些相應的數據。
 
 
 
下載這篇文章代碼,代碼包括callback.sql數據庫腳本,用于建立本文用那些數據。可以使用sql server或者msde 數據庫。 首先運行數據庫腳本,( 你可以根據需要更改,來使用其它數據庫)。然后啟動visual studio.net whidbey建立例子。
創造工程,選擇模板類型" asp.net web site "( 見圖3)。 這建立一個新頁default.aspx 。如果想也可以給它重新命名。
 
 
模板選擇: 在visual studio 里的模板選擇對話中選擇asp.net網站項目
 
在default.aspx頁面增加 dropdown controls如圖4中所示。
 你可以查看并且復制所有來自這篇文章下載代碼用<asp:table>包括的代碼。
為了實現遠程回調這個功能,必須實現icallbackeventhandler 接口。 在頁面增加以下的代碼。
<%@ implements interface=
 "system.web.ui.icallbackeventhandler" %>
this interface has a single public event definition that you must implement:
 public string raisecallbackevent(
 string eventargument) { 
 // server side handling here...
 } 
遠程回調使客戶端產生 raisecallbackevent. 因此,你應該處理并且返回基于客戶端發出的eventargument相應的信息。 你可以從方法簽名看見這種方法參數為一個string并且返回一個string。
菜鳥學堂: