ASP.NET 2.0 客戶端無刷新調用服務器端方法獲取數據

制約B/S程序的一個重要原因可能歸結於Http協議的無狀態性,每當我們要客戶端從服務器上獲取數據或想執行一段服務器端代碼,我們必須先提交頁面,在頁面提交後,事件句柄使代碼執行並把結果返回給提交的客戶端,這個事件驅動模式在大部分情況下沒有問題,但是它卻強制ASP.NET開發者必須多做一些事情。爲了保存窗體上的控件狀態,開發人員要麼使用大量降低頁面速度的ViewState,要麼得寫一些複雜的程序邏輯,而且這也使瀏覽器增加了處理時間。在小頁面上,這沒什麼問題,但是在一些大量DHTML應用的頁面,或內容很多的頁面上,寬帶用戶就會感覺到“閃”,而撥號用戶甚至會看見狀態欄中藍色的進度條。所以,如果能在客戶端調用服務器端代碼將是一件美好的事情,而ASP.NET 2.0 使其成爲現實。ASP.NET 2.0有一個受關注的焦點是客戶端回訪功能,也就是說在頁面上用客戶端的Javascript代碼調用服務器端代碼而不需要頁面回傳。在過去,TreeView控件的頻繁刷新頁面已經讓我們無法忍受,但是現在因爲有了Client Callback,我們可以告別這一現象了。

在瞭解回訪技術前,我們來看看現在通常程序員是怎麼做的。由javascript訪問服務器端代碼通常求助於微軟的XMLHTTP ActiveX組件。這個組件允許你通過http協議通過互聯網獲取xml文檔,然而並不像和它的名字所表示的那樣,其實你可以用這個組件來對任何服務器發送http請求,包括老式的asp,標準html,甚至php文件,而僅僅收回一個未處理的html輸出。因爲這個組件幾乎是一個標準的ActiveX組件,你可以用標準的javascript語法來實例化它: function RetrieveGoogleFrontPage() {    var XmlHttp = new ActiveXObject("Msxml2.XMLHTTP.4.0");    XmlHttp.Open("GET", "http://www.google.com", false);    XmlHttp.Send();    return XmlHttp.responseText; } 我們看到代碼非常的簡單,而所有代碼都是javascript中執行,不需要重新提交頁面,也就不會再閃了,但是請注意到,這個組件獲取的是整個頁面,所以如果你需要的僅僅是一部分數據,你需要單獨寫一個頁面來返回你需要的數據。

我們來看看ASP.NET 2.0中的Client Callback,其實在底層同樣是使用了XmlHttp技術,只不過封裝起來,對程序員屏蔽了。Client Callback由2部分組成:新的ICallbackEventHandler接口和Page類新的靜態方法 GetCallbackEventReference()。Page.GetCallbackEventReference()方法及其重載生成了客戶端所需要的javascript代碼段,這些代碼在底層使用了XmlHttp組件發出了一個http請求,而服務器端通過一個實現了ICallbackEventHandler接口的控件接受它,通常這個控件就是頁面自己本身,但是你也可以明確地用你自己的用戶控件或web控件對這個請求進行響應。當請求返回時,結果是通過另外一個javascript函數來接受的。我們來看一個從服務器獲取系統時間並在客戶端alert出來的代碼: <%@ page language="C#" compilewith="ServerTime.aspx.cs" classname="ASP.ServerTime_aspx"%> <html>    <head>       <title>Server Time</title>       <script language="javascript">           function GetServerTime()           {                  var message = '';       var context = '';                                     <%=sCallBackFunctionInvocation%>           }                    function ShowServerTime(timeMessage, context)   {               alert('The time on the server is:/n' + timeMessage);           }                    function OnError(message, context)   {               alert('An unhandled exception has occurred:/n' + message);    }       </script>    </head> <body>   <form id="MainForm" runat="server">      <input type="button" value="Get Server Time" οnclick="GetServerTime();" />   </form> </body> </html> using System; using System.Web.UI; namespace ASP { public partial class ServerTime_aspx : ICallbackEventHandler   {      public string sCallBackFunctionInvocation;       void Page_Load(object sender,System.EventArgs e)       {          sCallBackFunctionInvocation =this.GetCallbackEventReference(this,"message","ShowServerTime","context","OnError");       }       public string RaiseCallbackEvent(string eventArgument)       {                  return DateTime.Now.ToString();       }    } }

這裏注意到頁面實現了ICallbackEventHandler接口,這個接口只有一個方法RaiseCallbackEvent,這個方法就是頁面接受到一個回調請求時所執行的代碼在這個例子中,簡單地返回一個系統時間。爲了產生客戶端調用代碼,我們在Page_Load中調用了 Page.GetCallbackEventReference方法,這個方法有很多重載,但都包含了以下參數:即將接受請求的控件(在這裏是當前頁),包含參數值的客戶端變量名,以及請求返回或出錯時要執行的客戶端函數。返回值是生成的javascript代碼,在頁面上的<%=sCallBackFunctionInvocation%>在頁面執行時將被替換爲: __doCallback('__Page',message,ShowServerTime,context,OnError) __doCallback是ASP.NET 2.0的一個公共方法,用於向服務器回發請求。

從上圖中可以看出這種調用的過程。

 

注意:本文內容來自《ASP.NET 2.0's Client Callback Feature》(英文)一文,原文來自網絡,作者未知,翻譯時有刪節並對一些段落加入解釋與調整。

Trackback: http://tb.donews.net/TrackBack.aspx?PostId=1041695

發佈了57 篇原創文章 · 獲贊 6 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章