程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> 關於ASP.NET >> ASP.NET多事件無刷新客戶端回調

ASP.NET多事件無刷新客戶端回調

編輯:關於ASP.NET

適用於我自己想只占用一個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;
  }
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved