ASP.NET多事件无刷新客户端回调

2022-10-29 18:24:18
内容摘要
适用于我自己想只占用一个aspx、aspx.cs页面的情况,不过我怎么看都觉得我干嘛喜欢把简单事情搞复杂,我真是白痴
<!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;
  }
}


代码注释

作者:喵哥笔记

IDC笔记

学的不仅是技术,更是梦想!