讀取數據庫信息的客戶端回調程序
本程序是一個實現讀取Northwind數據庫的Emlpoyees信息,爲此你必須先保證Northwind數據庫存在。下圖是Emlpoyees表的內容。
在文本框輸入要查找的用戶名後,接着點擊"回調"按鈕就會發生客戶端回調。這是查找到用戶的顯示結果
用戶不存在的顯示信息:
後臺代碼:ClientCallbacksSimple.aspx.cs
02 using System.Data;
03 using System.Configuration;
04 using System.Collections;
05 using System.Web;
06 using System.Web.Security;
07 using System.Web.UI;
08 using System.Web.UI.WebControls;
09 using System.Web.UI.WebControls.WebParts;
10 using System.Web.UI.HtmlControls;
11 using System.Data.SqlClient;
12 public partial class ClientCallbacksSimple : System.Web.UI.Page, 13
13 System.Web.UI.ICallbackEventHandler
14 {
15 protected string strUserInfo; //保存讀取的用戶信息
16 //引發回調事件
17 public void RaiseCallbackEvent(string txtFirstName)
18 {
19 if (txtFirstName != null)
20 {
21 SqlConnection conn = new SqlConnection("data source=localhost;initial
22 catalog=Northwind;integrated security=SSPI");
23 conn.Open();
24 SqlCommand cmd = new SqlCommand("select EmployeeID,FirstName,City,Address 25
25 from Employees where FirstName=@FirstName", conn);
26 cmd.Parameters.Add("@FirstName", SqlDbType.NVarChar, 10).Value = txtFirstName;
27 SqlDataReader dr = cmd.ExecuteReader();
28 if (dr.Read())
29 {
30 strUserInfo = "員工代號:" + dr["EmployeeID"] + "/r/n";
31 strUserInfo += "姓名:" + dr["FirstName"] + "/r/n";
32 strUserInfo += "居住城市:" + dr["City"] + "/r/n";
33 strUserInfo += "地址:" + dr["Address"].ToString().Replace("/r/n","")+ "/r/n";
34 strUserInfo += "服務器查詢時間:" + DateTime.Now.ToLongTimeString();
35 }
36 else
37 {
38 if (String.IsNullOrEmpty(txtFirstName))
39 {
40 strUserInfo = "請輸入姓名";
41 }
42 else
43 {
44 strUserInfo = "查無此人";
45 }
46 }
47 cmd.Dispose();
48 dr.Dispose();
49 conn.Dispose();
50 }
51 }
52 //回傳回調結果
53 public string GetCallbackResult()
54 {
55 return strUserInfo; //回傳員工的基本信息
56 }
57 }
代碼說明:在RaiseCallbackEvent()方法中,傳遞了一個從前臺頁面文本框的輸入數據作爲其參數,即所要從數據庫查詢的用戶名。第28-34行代碼的功能爲讀取用戶的詳細信息,並且將用戶信息保存在一個字符串strUserInfo中。如果查找不到相應的用戶,則返回一些出錯信息,見代碼36-45。GetCallbackResult()方法回發回調結果,即保存用戶信息的字符串。
前臺代碼:ClientCallbacksSimple.aspx
02 Inherits="ClientCallbacksSimple" %>
03 <html xmlns="http://www.w3.org/1999/xhtml" >
04 <head runat="server">
05 <title>讀取數據庫信息的客戶端回調程序</title>
06 <script type="text/JavaScript">
07 function OnCallback(strUserInfo,context)
08 {
09 Results.innerText = strUserInfo;
10 }
11 </script>
12 </head>
13 <body>
14 <form id="form1" runat="server">
15 <div>
16 姓名:<input id="txtUserName" type="text" />
17 <input id="btnCallback" type="button" value="回調" οnclick="<%=
18 ClientScript.GetCallbackEventReference(this,"document.form1.txtUserName.value",
19 "OnCallback",null) %>" />
20 <br />
21 <div ID="Results" style="background-color: pink"></div>
22 </div>
23 </form>
24 </body>
25 </html>
代碼說明:這個程序與第一個程序的最大不同就是前臺頁面上有些細微的區別。如代碼17-19所示,我們將發送回調的ClientScript.GetCallbackEventReference()方法直接寫在了按鈕的單擊事件中,這也是一種可行且簡捷的方式。ClientScript.GetCallbackEventReference()方法的3個參數爲"OnCallback",表示回調完成後將回調結果返回給客戶端的OnCallback()腳本函數,在此回調結果strUserInfo將作爲該函數的一個參數在頁面進行顯示,如代碼9所示。由於我們在此沒有用到上下文的聯繫,所以ClientScript.GetCallbackEventReference()方法的4個參數爲"null",但是OnCallback()腳本函數還是要保留該"context"參數,因爲這是接受回調結果的客戶端函數的固定格式。
小結:
注意所有的異步技術如本文所探討的Callback客戶端回調,以及微軟新推出的Atlas框架,都不再使用傳統的Postback。因此客戶端在呈現由服務器端返回的數據時,瀏覽器下方將看不到一閃而過的綠色狀態條,並且異步過程只傳送和接受少量的數據,而非Postback過程中傳遞的整個ViewState狀態,因此程序在執行性能上有了較大的提高。希望讀者耐心理解和練習上述的兩個實例,只有通過自己的實踐才能理解客戶端回調的精髓。