asp.net|用戶端 有時我們需要使用JavaScript回調服務端以避免回傳過程中帶來的頁面重新整理,這樣不但減少了頁面重新整理的延時而且服務端無需處理每次回傳的大量檢視狀態(View State)資訊,應用程式的整體效能會有很大的提高。在ASP.NET 2.0中,引入了一個稱為"用戶端回調"的功能,利用這個內建的解決方案我們可以輕鬆實現用戶端指令碼和伺服器端代碼間的互動,從而避免了頁面因回傳帶來的頻繁重新整理。
為了實現用戶端回調,你的頁面類必須實現一個ICallbackEventHandler介面。其聲明如下:
using System;
namespace System.Web.UI
{
// 摘要:
// 用於指示控制項可以作為伺服器的回調事件的目標。
public interface ICallbackEventHandler
{
// 摘要:
// 返回以控制項為目標的回調事件的結果。
//
// 返回結果:
// 回調的結果。
string GetCallbackResult();
//
// 摘要:
// 處理以控制項為目標的回調事件。
//
// 參數:
// eventArgument:
// 一個字串,表示要傳遞到事件處理常式的事件參數。
void RaiseCallbackEvent(string eventArgument);
}
}
而用戶端的JavaScript要通過ClientScript.GetCallbackEventReference函數回調頁面,以下是該函數的說明:
public string GetCallbackEventReference (Control control,string argument,string clientCallback,string context)
參數:
參數 |
作用 |
control |
處理用戶端回調的伺服器 Control。該控制項必須實現 ICallbackEventHandler 介面並提供 RaiseCallbackEvent 方法。 |
argument |
從用戶端指令碼傳遞一個參數到伺服器端的RaiseCallbackEvent 方法。 |
clientCallback |
一個用戶端事件處理常式的名稱,該處理常式接收伺服器端事件返回的結果。 |
context |
啟動回調之前在用戶端的用戶端指令碼資訊。指令碼的結果傳回給用戶端事件處理常式。 |
傳回值 |
調用用戶端回調的用戶端函數的名稱。 |
下面是ClientScriptManager.GetCallbackEventReference 方法的重載列表
名稱 |
說明 |
ClientScriptManager.GetCallbackEventReference (Control, String, String, String) |
擷取一個對用戶端函數的引用;調用該函數時,將啟動一個對伺服器端事件的用戶端回調。此重載方法的用戶端函數包含指定的控制項、參數、用戶端指令碼和上下文。 |
ClientScriptManager.GetCallbackEventReference (Control, String, String, String, Boolean) |
擷取一個對用戶端函數的引用;調用該函數時,將啟動一個對伺服器端事件的用戶端回調。此重載方法的用戶端函數包含指定的控制項、參數、用戶端指令碼、上下文和布爾值。 |
ClientScriptManager.GetCallbackEventReference (Control, String, String, String, String, Boolean) |
擷取一個對用戶端函數的引用;調用該函數時,將啟動一個對伺服器端事件的用戶端回調。此重載方法的用戶端函數包含指定的控制項、參數、用戶端指令碼、上下文、錯誤處理程式和布爾值。 |
ClientScriptManager.GetCallbackEventReference (String, String, String, String, String, Boolean) |
擷取一個對用戶端函數的引用;調用該函數時,將啟動一個對伺服器端事件的用戶端回調。此重載方法的用戶端函數包含指定的目標、參數、用戶端指令碼、上下文、錯誤處理程式和布爾值。 我們就整個程式作個系統的說明,並且列出前台的頁面代碼和背景邏輯代碼,這樣可以使得你對程式有個直觀的理解。 |
下面是一個簡單樣本的原始碼:
Default.aspx.cs:
using System;
using System.Data;
using System.Configuration;
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;
public partial class _Default : System.Web.UI.Page, System.Web.UI.ICallbackEventHandler
{
//定義一個字串,回調的結果資訊將儲存在該字串中
private string result;
//引發回調事件處理
public void RaiseCallbackEvent(string eventArgument)
{
result = "從伺服器端返回的內容:" + eventArgument;
}
//回傳回調結果
public string GetCallbackResult()
{
return result;
}
}
Default.aspx:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!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>
<script type="text/javascript">
function CallServer(inputcontrol, context)
{
//回調還沒有處理完全時其積極式載入的顯示值
context.innerHTML = "載入中......";
//為你在文字框中輸入的資訊,並且arg在這裡就是將其值傳遞到
//RaiseCallbackEvent(String eventArgument)方法對應的eventArgument中
arg = inputcontrol.value;
//擷取一個對用戶端函數的引用;調用該函數時,將啟動一個對伺服器端事件的用戶端回調。
<%= ClientScript.GetCallbackEventReference(this, "arg", "ReceiveServerData", "context")%>;
}
function ReceiveServerData(result, context)
{
context.innerHTML = result;
}
</script>
<body>
<form id="form1" runat="server">
<div>
請輸入資訊: <asp:TextBox ID="txtEnter" runat="server"></asp:TextBox>
<input id="Button1" type="button" value="回調服務端" onclick="CallServer(txtEnter,lblShow)" />
<br />
<asp:Label ID="lblShow" runat="server" Width="219px"></asp:Label>
</div>
</form>
</body>
</html>