ASP.NET多事件无刷新客户端回调
2022-10-29 18:24:18<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional
适用于我自己想只占用一个aspx、aspx.cs页面的情况,不过我怎么看都觉得我干嘛喜欢把简单事情搞复杂,我真是白痴
<!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="form1" runat="server">
<div><input id="dog" type="text" /><span><a href="javascript:void(0)" onclick="Dog()">狗狗</a></span></div>
<div><input id="rabbit" type="text" /><span><a href="javascript:void(0)" onclick="Rabbit()">兔兔</a></span></div>
</form>
</body>
<script type="text/javascript">
function Dog()
{
//str是要传递给服务器端处理的字符串;
//function=Dog是为了在服务器端判断传进来的参数串是Dog()提交的,
//然后执行"处理Dog()参数串的方法",以达到分别处理事件的目的;
var str="function=Dog";
var params=document.getElementById("dog").value;
//传进来待处理参数,可以传进来多个参数,用&(其它符号)隔开
str+="&dog="+params;
//在此处调用服务端注册的函数
CallTheServer(str,'');
}
function Rabbit()
{
//str是要传递给服务器端处理的字符串;
//function=Rabbit是为了在服务器端判断传进来的参数串是Rabbit()提交的,
//然后执行"处理Rabbit()参数串的方法",以达到分别处理事件的目的;
var str="function=Rabbit";
var params=document.getElementById("rabbit").value;
str+="&rabbit="+params;
//在此处调用服务端注册的函数,跟Dog方法调用的是同一个;
CallTheServer(str,'');
}
//回调结果处理函数,rValue是服务器端返回给客户端的结果
function ReceiveServerData(rValue)
{
var str=new Array();
var temp=new Array();
//str[0]:function='value'是判断返回结果是哪个方法返回的一个判断标记
//str[1]:客户端要处理的返回结果
str=rValue.split('&');
//temp[1]:value标记的值
temp=str[0].split('=');
//把标记赋给str[0]来判断,抛弃temp变量数组
str[0]=temp[1];
if(str[0]=="Dog")
{
alert(str[1]);
}
if(str[0]=="Rabbit")
{
alert(str[1]);
}
}
</script>
</html>
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.WebControls.WebParts;
using System.Web.UI.HtmlControls;
//引用System.Web.UI.ICallbackEventHandler接口
//一定要实现ICallbackEventHandler接口,用于指示控件可以作为服务器的回调事件的目标
public partial class AspNetNoRefresh_AspNetNoRefresh : System.Web.UI.Page, ICallbackEventHandler
{
private string str = "";//返回客户端的结果
protected void Page_Load(object sender, EventArgs e)
{
//Page.ClientScript
//获取用于管理脚本、注册脚本和向页添加脚本的 System.Web.UI.ClientScriptManager 对象。
//返回结果:一个 System.Web.UI.ClientScriptManager 对象
//ClientScriptManager对象 是一些在Web应用程序中定义用于管理客户端脚本的方法,
//其中有一个方法重载:GetCallbackEventReference(……)
//string GetCallbackEventReference(Control control, string argument, string clientCallback, string context)
//获取一个对客户端函数的引用;调用该函数时,将启动一个对服务器端事件的客户端回调
//此重载方法的客户端函数包含指定的控件、参数、客户端脚本和上下文
//参数:control: 处理客户端回调的服务器 System.Web.UI.Control。该控件必须实现
//System.Web.UI.ICallbackEventHandler接口并提供
//System.Web.UI.ICallbackEventHandler.RaiseCallbackEvent(System.String)方法
//argument: 从客户端脚本传递给服务器端的一个参数
//System.Web.UI.ICallbackEventHandler.RaiseCallbackEvent(System.String)方法
//clientCallback: 一个客户端事件处理程序的名称,该处理程序接收成功的服务器端事件的结果
//context: 启动回调之前在客户端计算的客户端脚本;脚本的结果传回客户端事件处理程序
//第一句是GetCallbackEventReference函数
string cbReference = Page.ClientScript.GetCallbackEventReference(this, "arg", "ReceiveServerData", "context");
//第二句为生成要注册的客户端调用的JS函数CallTheServer,参数跟在前台的JS里书写的一致
//此函数的内容为上一句参数引用的脚本
string callbackScript = "function CallTheServer(arg,context){" + cbReference + "};";
//第三句为注册此脚本,利用RegisterStartupScript方法
//其中第一个参数为固定的;第二个参数提示的是要注册脚本启动的键;
//第三个是要注册的脚本的内容;最后一个参数为true就启用自动添加;
Page.ClientScript.RegisterStartupScript(this.GetType(), "abcdefg", callbackScript, true);
//经过第三句注册后实际发送到客户端的代码为:
//WebForm_InitCallback();function CallTheServer(param,context)
//{WebForm_DoCallback('__Page',arg,ReceiveServerData,context,null,false)};
}
/// <summary>
/// ICallbackEventHandler接口要实现的方法,处理以控件为目标的回调事件
/// </summary>
/// <param name="eventArgument">一个字符串,表示要传递到事件处理程序的事件参数</param>
public void RaiseCallbackEvent(string eventArgument)
{
//获取function的值,以及截掉function后的参数串
//如果有需要循环取参数,截掉是为了缩短参数串,减少不必要的循环
//如果参数串为空,还可以结束循环
string[,] function = GetParams("function",eventArgument);
//根据取出的function的值,执行相应的方法
if (function[0,0] == "Dog")
{
//function[0,1]是已切除function的eventArgument参数串
string[,] dog = GetParams("dog",function[0,1]);
//---------对dog[0,0]操作开始------------
//返回客户端的结果,有可能从多个方法返回,
//所以也需要添加标记,好让客户端根据相应的标记进行相应的处理
//这里function=Dog就是标记
str += "function=Dog&";
str += "这是小狗狗:" + dog[0, 0];
//---------对dog[0,0]操作结束------------
}
//根据取出的function的值,执行相应的方法
if (function[0,0] == "Rabbit")
{
string[,] rabbit = GetParams("rabbit", function[0, 1]);
//---------对rabbit[0,0]操作结束------------
str += "function=Rabbit&";
str += "这是可爱小兔兔:" + rabbit[0, 0] + ";我最爱你了!";
//---------对rabbit[0,0]操作结束------------
}
}
/// <summary>
/// ICallbackEventHandler接口要实现的方法,返回以控件为目标的回调事件的结果
/// </summary>
/// <returns>str:返回客户端的结果</returns>
public string GetCallbackResult()
{
return str;
}
/// <summary>
/// 对一串字符串处理,从字符串取出特定str的值,并返回截掉str的字符串,
/// </summary>
/// <param name="str">检查argument是否存在str,存在的话,取出str的值</param>
/// <param name="argument">要处理的字符串</param>
/// <returns>var[0,0]:参数str的值</returns>
/// <returns>var[0,1]:截掉str的argument参数串</returns>
protected string[,] GetParams(string str, string argument)
{
string[,] var =new string[1,2];
if (argument.ToString().Trim() != "" && argument.Contains("&"))
{
string[] arr = argument.Split('&');//利用'&'分割字符串为字符串数组
for (int i = 0; i < arr.Length; i++)
{
if (arr[i].Contains(str))
{//检查argument是否存在str,存在的话,取出=两边的值
string[] arrChild = arr[i].Split('=');
//判断=左边的值是否等于str,等于的话,把=号右的值赋给var[0,0];
//把切除str='value'的字符串赋给var[0,1]
if (arrChild[0].ToString().Trim() == str)
{
var[0, 0] = arrChild[1];
//切除str='value'+&的长度
//break:取出参数后,直接跳出循环,避免不必要的循环
var[0, 1] = argument.Substring(arr[i].Length + 1); break;
}
}
}
}//字符串的最后一个参数的处理
else if(argument.ToString().Trim() != "" && !argument.Contains("&"))
{
if (argument.Contains(str))
{
string[] arrChild = argument.Split('=');
//判断=左边的值是否等于str,等于的话,把=号右的值赋给var[0,0];
//把切除str='value'的字符串赋给var[0,1]
if (arrChild[0].ToString().Trim() == str)
{
var[0, 0] = arrChild[1];
//最后一个字符串没有&符号,切除str='value'的长度即可
var[0, 1] = argument.Substring(argument.Length);
}
}
}
return var;
}
}