Asp.net編程中的回調技術(CallBack)

來源:互聯網
上載者:User

回調技術(CallBack)
      在asp.net中用戶端與伺服器端的互動預設都是整頁面提交,此時用戶端將當前頁面表單中的資料(包括一些自動產生的隱藏欄位)都提交到伺服器端,伺服器重新執行個體化一個當前頁面類的執行個體響應這個請求,然後將整個頁面的內容重新發送到用戶端,這種處理方式對運行結果沒什麼影響,不過這種方式加重了網路的資料轉送負擔、加大了伺服器的工作壓力,並且使用者還需要等待最終處理結果。假如是我們希望有這麼一個功能,當使用者填寫完使用者名稱之後就檢查伺服器資料庫裡是否已存在該使用者名稱,如果存在就給出已經存在此使用者名稱的提示,如果不存在就提示使用者此使用者名稱可用,對於這種情況其實只需要傳遞一個使用者名稱作為參數即可,上面的做法卻需要提交整個表單,有點小題大做。解決上面的問題的辦法目前主流做法有三種:純javascript實現、微軟Ajax類庫實現還有用AjaxPro實現。後兩種做法在稍後的文章中會講到,這裡我講另外一種實現:通過回調技術。

建立實現回調技術的網頁與普通asp.net網頁類似,只不過還需要做以下特殊工作:
(1)讓當前頁面實現ICallbackEventHandler介面,這個介面定義了兩個方法:string GetCallbackResult ()方法和void RaiseCallbackEvent (string eventArgument)方法。其中GetCallbackResult ()方法的作用是返回以控制項為目標的回調事件的結果,RaiseCallbackEvent()方法的作用是處理以控制項為目標的回調事件。
(2)為當前頁提供三個javascript用戶端指令碼函數。一個javascript函數用於執行對伺服器的實際請求,在這個函數中可以提供一個字串類型的參數發送到伺服器端;另一個javascript函數用於接收伺服器端方法的執行後返回的字串類型結果,並處理這個結果;還有一個是執行對伺服器請求的協助函數,在伺服器代碼中通過GetCallbackEventReference()方法擷取這個方法的引用時由asp.net自動產生這個函數。
下面我以一個詳細的例子來講述如何使用回調,用Dreamweaver建立一個Register. aspx頁面,代碼如下:

 

<%@ Page Language="C#" ContentType="text/html" ResponseEncoding="gb2312" %>
<%@ Implements Interface="System.Web.UI.ICallbackEventHandler" %>
<%@ Import Namespace="System.Text" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>使用者註冊</title>
<script language="javascript">
//用戶端執行的方法
//下面的方法是接收並處理伺服器方法執行的返回結果
function Success(args, context)
{
    message.innerText  = args;
}
//下面的方式是當接收伺服器方法處理的結果發生異常時調用的方法
function Error(args, context)
{
    message.innerText  = '發生了異常';
}
</script>
<script language="c#" runat="server">
string result="";
// 定義在伺服器端啟動並執行回調方法.
public void RaiseCallbackEvent(String eventArgument)
{
 if(eventArgument.ToLower().IndexOf("admin")!=-1)
 {
  result=eventArgument+"不能作為使用者名稱註冊。";
 }
 else
 {
  result=eventArgument+"可以註冊。";
 }
 //throw new Exception();
}
//定義返回回調方法執行結果的方法
public string GetCallbackResult()
{
 return result;
}
//伺服器上執行的方法
public void Page_Load(Object sender,EventArgs e)
{
 // 擷取當前頁的ClientScriptManager的引用
    ClientScriptManager csm = Page.ClientScript;
 // 擷取回調引用。會在用戶端產生WebForm_DoCallback方法,調用它來達到非同步呼叫。這個方式是微軟寫的方法,會被發送到用戶端
 //注意這裡的"Success"和"Error"兩個字串分別用戶端代碼中定義的兩個javascript函數
 //下面的方法最後一個參數的意義:true表示執行非同步回調,false表示執行同步回調
 String reference = csm.GetCallbackEventReference(this, "args","Success","","Error",false);
 String callbackScript = "function CallServerMethod(args, context) {\n" + 
  reference + ";\n }";
 // 向當前頁面註冊javascript指令碼代碼
 csm.RegisterClientScriptBlock(this.GetType(), "CallServerMethod", 
  callbackScript, true);
}
</script>
</head>
<body>
<form id="form1" runat="server">
<table border="1" cellpadding="0" cellspacing="0" width="400px">
<tr>
<td width="100px">使用者名稱</td><td><input type="text" size="10" maxlength="20" id="txtUserName" onblur="CallServerMethod(txtUserName.value,null)" /><span id="message"></span></td>
</tr>
<tr>
<td>密碼</td><td><input type="password" size="10" maxlength="20" id="txtPwd" /></td>
</tr>
</table>
</form>
</body>
</html>
上面的頁面中我已經添加了足夠詳盡的注視,不過我還是要說明幾點:
(1)

<%@ Implements Interface="System.Web.UI.ICallbackEventHandler" %>
這句表示當前頁面實現了ICallbackEventHandler介面,如果採用頁面與代碼分離的模式,後台cs代碼則應是:

public partial class Register : System.Web.UI.Page, ICallbackEventHandler
{
//cs代碼
}
(2)

<input type="text" size="10" maxlength="20" id="txtUserName" onblur="CallServerMethod(txtUserName.value,null)" />
這裡有一個onblur="CallServerMethod(txtUserName.value,null),表示當使用者名稱文字框失去焦點之後激發CallServerMethod這個用戶端方法,這個用戶端方法是由asp.net動態產生的。
(3)

csm.GetCallbackEventReference(this, "args","Success","","Error",false);
中的"Success"和"Error"分別代表用戶端的javascript函數,可以在代碼中見到,其中"Success"代表調用伺服器端方法成功後要執行的用戶端方法名,"Error"代表調用伺服器端方法失敗時調用的用戶端方法名。

本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/zhoufoxcn/archive/2008/09/28/2990318.aspx

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.