关于C#中的WEB开发的回调函数的实现
首先,在实现这个小DEMO的之前应该了解到什么叫回调函数,从MSDN上找来回调函数的定义比较晦涩,不知道在哪看过对回调函数的一种抽象的理解,什么是回调?有人这么说:“发布者说,当我遇到什么事的时候,我就通知大家,有需要通知的就把电话号码给我,等那件事发生时,我就打电话通知大家;”。
而编程中的回调函数只是一个功能片段,由用户按照回调函数调用约定来实现的一个函数。回调函数是一个工作流的一部分,由工作流来决定函数的调用(回调)时机。(比较难懂吧)
为什么会有回调函数,回调函数能帮助我们解决什么样的开发问题,大家都知道AJAX吧,AJAX的处理时异步的,主要原理是将数据发送到另一个页面处理后再将处理结果返回当前页面。而回调函数也是类似于这种AJAX异步的方式,不同之处就是在于回调函数是将前台数据发送到本页面的后台处理程序中处理后再将数据发送回来。至于你想选择用哪种方式实现异步,两种方式都无可厚非。在实际项目开发中我用回调函数实现的是对某一内容加关注(类似于博客加关注),需要将ID号发送到后台实现数据库的交互。因为这样可以在同一个页面调用相同的参数处理,比较方便。参数可以在多个方法体中应用。
这个小DEMO实现的功能就是前台有一个文本框,文本框里输入数字,将数字通过回调函数的形式发送到后台进行奇数和偶数进行处理,如果是奇数返回1,是偶数返回0,
要在后台实现回调函数,必须在后台的页面类实现 System.Web.UI.ICallbackEventHandler的接口,而该接口必须显示实现两个方法,具体代码参考如下
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;//定义一个字符串的变量用以接受和传递前台发送到后台的数据
protected void Page_Load(object sender, EventArgs e)
{
}
#region ICallbackEventHandler 成员
/// <summary>
/// 经过后台服务器处理的数据返回给前台客户端
/// </summary>
/// <returns></returns>
public string GetCallbackResult()
{
//throw new Exception("The method or operation is not implemented.");
//在真实的应用中前台的数据会经过以下的逻辑代码进行处理,下面我们来模拟一个情况。
/* 若前台发来的字符串转换为数字,若是偶数返回0,若是奇数返回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>
/// 获取客户端发送至后台服务器端的参数
/// </summary>
/// <param name="eventArgument">前台客户端发送到后台服务器端的参数</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" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>无标题页</title>
<script type="text/javascript" language="javascript">
function callServer()
{
var sendServerArg = document.getElementById("Txt_Input").value;
<%=ClientScript.GetCallbackEventReference(this, "sendServerArg", "receiveServerResult", null, true)%>; //这个方法实现的是前台和后台的数据通信。
}
function receiveServerResult(result)
{
if(result == "0")
{
alert("传入到服务器的参数是偶数");
}
else
{
alert("传入到服务器的参数是奇数");
}
}
</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="调用回调函数" OnClientClick="callServer();" />
</div>
</form>
</body>
</html>
运行结果如下:
这个DEMO很简单的,但是原理和方法基本就是这样,可以实现很复杂的东东,比如页面数据太大的时候,用这个减少前台和后台的数据通信量,对于从后台返回到前台的数据,在前台用JavaScript处理,如果熟悉JQuery的话更能处理好后台数据结果在前台数据的处理和显示。
作者: zhongyong314 发表于 2011-08-11 17:25 原文链接