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")
Public
Public