<!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; 
  } 
}
- 本文标题: ASP.NET多事件无刷新客户端回调
- 文章分类:【.NET/Web】
- 非特殊说明,本文版权归【胡同里的砖头】个人博客 所有,转载请注明出处.
- 上一篇:教你网站浏览速度提升的七大秘方
- 下一篇: js获取select下拉菜单选中的值的解决方案