要解析callback的实现机制,那还是让我们从一个callback调用的客户端脚本调用开始,看看,微软是怎么实现这个callback机制的。
1、ClientScript.GetCallbackEventReference(...)
要激发一个callback,首先,当然需要在客户端本中发出一个调用。一个典型的调用语法如下:
<script language="javascript" type="text/javascript">
function any_script_function(arg, context)
{
<%= ClientScript.GetCallbackEventReference(this, "arg", "ReceiveServerData", "context")%>;
}
</script>
ClientScript.GetCallbackEventReference(...)将根据传入的参数返回实际的回调脚本。这个函数有多个重载版本,因此,这些参数的含义,大家可以参考MSDN。以具体的上面这段示例代码中的参数来说:
- this表示执行回调的的服务端控件是当前这个Page,当前的Page必须实现ICallbackEventHandler接口,包括必须实现string GetCallbackResult()和void RaiseCallbackEvent(eventArgument)这两个接口函数,这个参数也可以是指向某个WEB控件的引用,当然,这个空间也必须实现ICallbackEventHandler接口;
- "arg"是将被传给RaiseCallbackEvent的参数eventArgument的值,可以使人以自定义格式的字符串;
- "ReceiveServerData"是当回调成功之后,处理返回内容的客户端脚本函数的名称,这个函数必须存在于执行回调的页面,并且这个函数可以包含两个参数,例如:
<script type="text/javascript">
function ReceiveServerData(result, context)
{}
</script>
这两个参数,分别是回调的返回数据result,和原封不动被返回的我们激发回调时的这个context参数,当然,这两个参数都是字符串类型的。
CS代码如下:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
public partial class third : System.Web.UI.Page,System.Web.UI.ICallbackEventHandler
{
private string returnValue;
protected void Page_Load(object sender, EventArgs e)
{
/string str = Page.ClientScript.GetCallbackEventReference(this, "document.getElementById('Select1').options[document.getElementById('Select1').selectedIndex].text", "ResultValue", null);
////return false是为了防止提交窗体
//Button1.Attributes.Add("onclick", str + ";return false;");
}
#region ICallbackEventHandler Members
public void RaiseCallbackEvent(string eventArgument)
{
if (eventArgument == "KKKKK")
{
returnValue= "KKKKKKKKK!";
}
else
{
returnValue= "BTBTBTBTBT!";
}
}
public string GetCallbackResult()
{
return returnValue;
}
#endregion
}
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="third.aspx.cs" Inherits="third" %>
<!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>
</head>
<body>
<form id="form2" runat="server">
<div>
<select id="Select1">
<option selected="selected" value=1>KKKKK</option>
<option value=2>BTBTBTBT</option>
</select>
<asp:Button ID="Button1" runat="server" Text="这是个服务器按钮" /></div>
<div id="div1" />
<script type="text/javascript">
function ResultValue(ret,context)
{
document.getElementById("div1").innerHTML = ret;
alert(ret);
}
</script>
</form>
</body>
</html>