如題,這個Callback方法其實在現行的技術很容易實現,但是對asp.net就複雜很多,所以簡單紀錄一下。

使用回調的步驟如下:

  1. 在控件或者page類中實現 ICallbackEventHandler 介面,分別是 RaiseCallbackEvent() 和 GetCallbackResult() 。 RaiseCallbackEvent()是回調執行的方法,該方法處理回調的內容。 他沒有返回值,而是從瀏覽器接受一個字元串作為事件的參數,即接受用戶端javaScript傳遞的參數。 它是首先觸發的,接下來觸發的就是 GetCallbackResult() ,他將得到的結果返回給客戶端的腳本。
  2. 生成調用該回調的用戶端腳本。 可通過 ClientScriptManager 類得 GetCallbackEventReference() 生成。 Page類得 ClientScript 屬性就是一個 ClientScriptManager 類得實例。
  3. 編寫代碼調用在第二步中生成的用戶端腳本。

下面是兩個例子:

(1)由使用者觸發

初始化: 在頁面中添加

<body>
<form id="a1" runat=server>
    <div>
        <input id="txtUserName" type="text" />
        <input id="btnCallBack" type="button" value="callBack" onclick="<%= ClientScript.GetCallbackEventReference(this,"document.getElementById('txtUserName').value","onCallBack",null) %>" />
    </div>
    </form>
    <p id="result">
    </p>
    <div>
        <input id="btnJTest" type="button" value="button" />
    </div>
</body>
  1. 在button的 onclick 中寫入:
    onclick=“<%= ClientScript.GetCallbackEventReference(this,”document.getElementById('txtUserName').value“,”onCallBack“,null) %>”
  2. 在javascript中編寫相應的函數
    function onCallBackNoBtn()
    {
     callServer(document.getElementById('txtUserName').value,"");
    }
    
  3. 在 xxx.aspx.cs 中繼承 ICallbackEventHandler 並實現其方法。
    RaiseCallbackEvent() 負責接收 client 端的javascript 所傳送過來的參數,以此參數查詢資料庫中的數據,最後由 GetCallbackResult() 將結果傳回 client端的javascript,最後將結果顯示出來。

    public partial class webPage_callBackBtn : System.Web.UI.Page, ICallbackEventHandler
    {
     protected string strUserInfo;  //callback最终得到的信息
     protected void Page_Load(object sender, EventArgs e)
     {
     }
    
     #region ICallbackEventHandler 成员
    
     public string GetCallbackResult()
     {
         return strUserInfo;
     }
    
     public void RaiseCallbackEvent(string eventArgument)  //服务端的处理函数
     {
         if (eventArgument == "") return;
         System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection();
         conn.ConnectionString = System.Web.Configuration.WebConfigurationManager.ConnectionStrings["nowthWindConnectionString"].ConnectionString;
    
         SqlCommand cmd = new SqlCommand();
         cmd.CommandType = CommandType.Text;
         cmd.Parameters.Add("@FirstName", SqlDbType.NVarChar, 10)
             .Value = eventArgument;
         cmd.CommandText = "SELECT EmployeeID, LastName FROM Employees WHERE FirstName=@FirstName";
         cmd.Connection = conn;
    
         SqlDataReader reader;
         ConnectionState previousConnectionState = conn.State;
    
         try
         {
             if (conn.State == ConnectionState.Closed)
             {
                 conn.Open();
             }
    
             reader = cmd.ExecuteReader();
    
             using (reader)
             {
                 while (reader.Read())
                 {
                     // Process SprocResults datareader here.
                     strUserInfo += reader[0];
                 }
             }
             strUserInfo += "###";
         }
         finally
         {
             if (previousConnectionState == ConnectionState.Closed)
             {
                 conn.Close();
             }
         }
     }
    
     #endregion
    }
    
  4. 現在在 textbox 中輸入 Nancy 則會顯示 1### 。
(2)自動觸發。
  1. 如上 3. 在 xxx.aspx.cs 中繼承 ICallbackEventHandler 並實現其方法。
  2. 在 javascript中添加

    <script type="text/javascript">
     function doSearch(){ 
         var txtFirstName= document.getElementById("txtUserName"); 
         callServer(txtFirstName.value,""); 
     }
    
     function receiveServerData(txtUserInfo)
     {
         Results.innerText=txtUserInfo;
     }
    
     var int=self.setInterval('doSearch()',5000);
     </script>
    
  3. 在 aspx.cs 中動態註冊 javascript
    protected void Page_Load(object sender, EventArgs e)
     {
         string cbReference = Page.ClientScript.GetCallbackEventReference(this,"arg", "receiveServerData", null);
         //Page.ClientScript.GetCallbackEventReference(this,"arg", "receiveServerData", null);
         string callBackScript;
         callBackScript = "function callServer(arg,context){" + cbReference + "};";
         //string callBackScript = "function callServer(arg,context){WebForm_DoCallback('__Page',arg,receiveServerData,null,null,false)};";
         Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "CallServer123", callBackScript, true);
     }
    
  4. 完成

參考:
https://www.cnblogs.com/xiangniu/archive/2011/03/11/1981812.html


#ASP.NET #webform #Callback #icallbackeventhandler #RaiseCallbackEvent #GetCallbackResult #clientscriptmanager







Related Posts

從物件理解變數 / Immutable 觀念整理

從物件理解變數 / Immutable 觀念整理

#2 數位電路設計

#2 數位電路設計

程式導師實驗計畫 Week6 作業與解答

程式導師實驗計畫 Week6 作業與解答


Comments