Client CallBack實作

Client CallBack的練習

步驟一: 實作 ICallbackEventHandler 介面
在vb中 Implements System.Web.UI.IcallbackEventHandler後,VS會自動產生以下2段程式
 

    '實作 GetCallbackResult 方法,這個方法會被叫用,以便在伺服器上執行回呼
    Public Function GetCallbackResult() As String Implements System.Web.UI.ICallbackEventHandler.GetCallbackResult
    End Function

    '實作 RaiseCallbackEvent方法,這個方法會將回呼結果傳回給用戶端
    Public Sub RaiseCallbackEvent(ByVal eventArgument As String) Implements System.Web.UI.ICallbackEventHandler.RaiseCallbackEvent
    End Sub


步驟二:於Page_Load註冊JavaScript(網頁程式與後端程式的橋樑)
 

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim cbReference As String = Page.ClientScript.GetCallbackEventReference(Me, "arg", "ReceiveServerData", "context")
        Dim callbackScript As String = "function CallServer(arg,context){" + cbReference + "}"
        '若未註冊過CallServer,則註冊
        If (Not Page.ClientScript.IsClientScriptBlockRegistered(Me.GetType, "CallServer")) Then
            Page.ClientScript.RegisterClientScriptBlock(Me.GetType, "CallServer", callbackScript, True)
        End If
    End Sub

步驟三:編寫GetCallbackResult 方法及RaiseCallbackEvent方法
 

 步驟三:編寫GetCallbackResult 方法及RaiseCallbackEvent方法

Protected txtUserInfo As String '使用者資訊
   Public Function GetCallbackResult() As String Implements System.Web.UI.ICallbackEventHandler.GetCallbackResult
        Return txtUserInfo
    End Function


    Public Sub RaiseCallbackEvent(ByVal eventArgument As String) Implements System.Web.UI.ICallbackEventHandler.RaiseCallbackEvent
        If (Not eventArgument Is Nothing) Then
            Dim conn As New SqlConnection(ConnectionString)
            Dim cmd As SqlCommand = conn.CreateCommand
            cmd.CommandText = "Select top 1 User_ID From User_Data Where User_Name Like '%'+@User_Name+'%'"
            cmd.Parameters.AddWithValue("@User_Name", eventArgument)
            Try
                conn.Open()
                Dim dr As SqlDataReader = cmd.ExecuteReader
                If dr.Read Then
                    txtUserInfo += "編號為:" + dr("User_ID").ToString.Trim
                Else
                    If String.IsNullOrEmpty(eventArgument) Then
                        txtUserInfo = "姓名??"
                    Else
                        txtUserInfo = "無此人"
                    End If
                End If
                dr.Close()
            Catch ex As Exception
                MyBase.Msg(ex.ToString)
            Finally
                conn.Dispose()
            End Try
        End If
    End Sub


步驟四:編寫網頁
 

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="testCallBack.aspx.vb" Inherits="Lab_testCallBack" %>
<!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>testCallBack</title>
</head>
<script type="text/javascript">
    function DoSearch() {
        var txtFirstName = document.getElementById("txtUserName");
        CallServer(txtFirstName.value, "");
    }
    function ReceiveServerData(arg,context) {
        Results.innerText = arg ;
    }
    //setInterval('DoSearch()', 1000);
</script>
<body>
    <form id="form1" runat="server">
    <div>
        使用者<asp:TextBox ID="txtUserName" runat="server" ></asp:TextBox><asp:Button ID="Button1"
            runat="server" Text="Button" OnClientClick="DoSearch();return false;" />
        <span id="Results" style="background-color:Pink;width:500px;"></span>
    </div>
    </form>
</body>
</html>

 

觀察結果
1.實作了ICallbackEventHandler,所以在網頁中出現了以下JavaScript
<script type="text/javascript">
//<![CDATA[
WebForm_InitCallback();//]]>
</script>
2.在Page_Load中註冊的程式碼如下
<script type="text/javascript">
//<![CDATA[
function CallServer(arg,context){WebForm_DoCallback('__Page',arg,ReceiveServerData,context,null,false)}//]]>
</script>
所以當按鍵點擊後,會呼叫JavaScript:DoSearch()
,然後再呼叫Page_Load中註冊的程式CallServer(arg,context)
,然後回到後端觸發RaiseCallbackEvent事件
,事件處理完後,再執行GetCallbackResult,將資料回傳至網頁JavaScript:ReceiveServerData(arg,context)
,注意,為什麼後端會知道要將程式回傳給ReceiveServerData(arg,context)呢?
原因就在Page_Load中註冊的程式碼中=> Dim cbReference As String = Page.ClientScript.GetCallbackEventReference(Me, "arg", "ReceiveServerData", "context")