首页 / 网页编程 / ASP.NET / ASP.NET多事件无刷新客户端回调
ASP.NET多事件无刷新客户端回调2011-01-15适用于我自己想只占用一个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; } }
收藏该网址