如題,這個Callback方法其實在現行的技術很容易實現,但是對asp.net就複雜很多,所以簡單紀錄一下。
使用回調的步驟如下:
- 在控件或者page類中實現 ICallbackEventHandler 介面,分別是 RaiseCallbackEvent() 和 GetCallbackResult() 。 RaiseCallbackEvent()是回調執行的方法,該方法處理回調的內容。 他沒有返回值,而是從瀏覽器接受一個字元串作為事件的參數,即接受用戶端javaScript傳遞的參數。 它是首先觸發的,接下來觸發的就是 GetCallbackResult() ,他將得到的結果返回給客戶端的腳本。
- 生成調用該回調的用戶端腳本。 可通過 ClientScriptManager 類得 GetCallbackEventReference() 生成。 Page類得 ClientScript 屬性就是一個 ClientScriptManager 類得實例。
- 編寫代碼調用在第二步中生成的用戶端腳本。
下面是兩個例子:
(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>
- 在button的 onclick 中寫入:
onclick=“<%= ClientScript.GetCallbackEventReference(this,”document.getElementById('txtUserName').value“,”onCallBack“,null) %>” - 在javascript中編寫相應的函數
function onCallBackNoBtn() { callServer(document.getElementById('txtUserName').value,""); }
在 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 }
- 現在在 textbox 中輸入 Nancy 則會顯示 1### 。
(2)自動觸發。
- 如上 3. 在 xxx.aspx.cs 中繼承 ICallbackEventHandler 並實現其方法。
在 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>
- 在 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); }
- 完成
參考:
https://www.cnblogs.com/xiangniu/archive/2011/03/11/1981812.html