轉(zhuǎn)帖|其它|編輯:郝浩|2011-08-15 15:06:26.000|閱讀 1071 次
概述:本文主要講述C#中的WEB開發(fā)的回調(diào)函數(shù)的實現(xiàn),希望對大家有幫助。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
首先,在實現(xiàn)這個小DEMO的之前應(yīng)該了解到什么叫回調(diào)函數(shù),從MSDN上找來回調(diào)函數(shù)的定義比較晦澀,不知道在哪看過對回調(diào)函數(shù)的一種抽象的理 解,什么是回調(diào)?有人這么說:“發(fā)布者說,當(dāng)我遇到什么事的時候,我就通知大家,有需要通知的就把電話號碼給我,等那件事發(fā)生時,我就打電話通知大 家;”。
而編程中的回調(diào)函數(shù)只是一個功能片段,由用戶按照回調(diào)函數(shù)調(diào)用約定來實現(xiàn)的一個函數(shù)。回調(diào)函數(shù)是一個工作流的一部分,由工作流來決定函數(shù)的調(diào)用(回調(diào))時機(jī)。(比較難懂吧)
為什么會有回調(diào)函數(shù),回調(diào)函數(shù)能幫助我們解決什么樣的開發(fā)問題,大家都知道AJAX吧,AJAX的處理時異步的,主要原理是將數(shù)據(jù)發(fā)送到另一個頁面 處理后再將處理結(jié)果返回當(dāng)前頁面。而回調(diào)函數(shù)也是類似于這種AJAX異步的方式,不同之處就是在于回調(diào)函數(shù)是將前臺數(shù)據(jù)發(fā)送到本頁面的后臺處理程序中處理 后再將數(shù)據(jù)發(fā)送回來。至于你想選擇用哪種方式實現(xiàn)異步,兩種方式都無可厚非。在實際項目開發(fā)中我用回調(diào)函數(shù)實現(xiàn)的是對某一內(nèi)容加關(guān)注(類似于博客加關(guān) 注),需要將ID號發(fā)送到后臺實現(xiàn)數(shù)據(jù)庫的交互。因為這樣可以在同一個頁面調(diào)用相同的參數(shù)處理,比較方便。參數(shù)可以在多個方法體中應(yīng)用。
這個小DEMO實現(xiàn)的功能就是前臺有一個文本框,文本框里輸入數(shù)字,將數(shù)字通過回調(diào)函數(shù)的形式發(fā)送到后臺進(jìn)行奇數(shù)和偶數(shù)進(jìn)行處理,如果是奇數(shù)返回1,是偶數(shù)返回0,
要在后臺實現(xiàn)回調(diào)函數(shù),必須在后臺的頁面類實現(xiàn) System.Web.UI.ICallbackEventHandler的接口,而該接口必須顯示實現(xiàn)兩個方法,具體代碼參考如下
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Collections.Generic;
using System.Collections;
public partial class _Default : System.Web.UI.Page,System.Web.UI.ICallbackEventHandler
{
public string _getClientParm;//定義一個字符串的變量用以接受和傳遞前臺發(fā)送到后臺的數(shù)據(jù)
protected void Page_Load(object sender, EventArgs e)
{
}
#region ICallbackEventHandler 成員
/// <summary>
/// 經(jīng)過后臺服務(wù)器處理的數(shù)據(jù)返回給前臺客戶端
/// </summary>
/// <returns></returns>
public string GetCallbackResult()
{
//throw new Exception( "The method or operation is not implemented.");
//在真實的應(yīng)用中前臺的數(shù)據(jù)會經(jīng)過以下的邏輯代碼進(jìn)行處理,下面我們來模擬一個情況。
/* 若前臺發(fā)來的字符串轉(zhuǎn)換為數(shù)字,若是偶數(shù)返回0,若是奇數(shù)返回1.
*
* */
string returnClientResult= "";
try
{
int i = Int32.Parse(_getClientParm);
if (i % 2 == 0)
{
returnClientResult = "0";
}
else
{
returnClientResult = "1";
}
}
catch
{
throw new Exception( "異常信息.........");
}
return returnClientResult;
}
/// <summary>
/// 獲取客戶端發(fā)送至后臺服務(wù)器端的參數(shù)
/// </summary>
/// <param name="eventArgument">前臺客戶端發(fā)送到后臺服務(wù)器端的參數(shù)</param>
public void RaiseCallbackEvent(string eventArgument)
{
//throw new Exception( "The method or operation is not implemented.");
_getClientParm = eventArgument;
}
#endregion
}
上面都有注釋,而在前臺中的頁面代碼如下所示:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "//www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="//www.w3.org/1999/xhtml" >
<head runat="server">
<title>無標(biāo)題頁</title>
<script type="text/javascript" language="javascript">
function callServer()
{
var sendServerArg = document.getElementById( "Txt_Input").value;
<%=ClientScript.GetCallbackEventReference(this, "sendServerArg", "receiveServerResult", null, true)%>; //這個方法實現(xiàn)的是前臺和后臺的數(shù)據(jù)通信。
}
function receiveServerResult(result)
{
if(result == "0")
{
alert( "傳入到服務(wù)器的參數(shù)是偶數(shù)");
}
else
{
alert( "傳入到服務(wù)器的參數(shù)是奇數(shù)");
}
}
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:TextBox ID="Txt_Input" runat="server"></asp:TextBox>
<asp:Button ID="Btn_CallBack" runat="server" Text="調(diào)用回調(diào)函數(shù)" OnClientClick="callServer();" />
</div>
</form>
</body>
</html>
運(yùn)行結(jié)果如下:
這個DEMO很簡單的,但是原理和方法基本就是這樣,可以實現(xiàn)很復(fù)雜的東東,比如頁面數(shù)據(jù)太大的時候,用這個減少前臺和后臺的數(shù)據(jù)通信量,對于從后 臺返回到前臺的數(shù)據(jù),在前臺用JavaScript處理,如果熟悉JQuery的話更能處理好后臺數(shù)據(jù)結(jié)果在前臺數(shù)據(jù)的處理和顯示。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:博客園