ASP.NET 2.0 內建的 Script Callback 機制,是 AJAX 技術在 WebForms 中的早期實現。它允許瀏覽器透過 JavaScript 非同步呼叫伺服器端方法,並接收字串結果,無需整頁回發。本文從介面實作、客戶端腳本生成、生命週期三個層面深度剖析其運作原理。
public interface ICallbackEventHandler
{
// 伺服器端處理回調邏輯,eventArgument 為客戶端傳入字串
void RaiseCallbackEvent(string eventArgument);
// 回傳給客戶端的字串結果
string GetCallbackResult();
}
頁面或控制項實作此介面即可成為回調目標。
public partial class CallbackDemo : Page, ICallbackEventHandler
{
private string _callbackResult;
protected void Page_Load(object sender, EventArgs e)
{
// 1. 取得客戶端呼叫伺服器的腳本參考
string cbRef = ClientScript.GetCallbackEventReference(
this, "arg", "ClientCallback", "context", "ClientError", true);
// 2. 封裝為可呼叫的 JS 函數
string script = $"function CallServer(arg, context) {{ {cbRef} }};";
// 3. 註冊啟動腳本
ClientScript.RegisterStartupScript(GetType(), "CallbackScript", script, true);
// 4. 綁定控制項事件觸發回調
Button1.Attributes["onclick"] = "CallServer('Hello from client', 'ctx'); return false;";
}
// ICallbackEventHandler 實作
public void RaiseCallbackEvent(string eventArgument)
{
// 模擬伺服器處理
_callbackResult = $"Server received: {eventArgument} at {DateTime.Now}";
}
public string GetCallbackResult()
{
return _callbackResult;
}
}
<script type="text/javascript">
function ClientCallback(result, context) {
alert("成功:" + result + " | Context: " + context);
}
function ClientError(error, context) {
alert("錯誤:" + error);
}
</script>
<asp:Button ID="Button1" runat="server" Text="觸發回調" />
| 特性 | 說明 |
|---|---|
| 單一字串參數 | `eventArgument` 僅支援單一字串,複雜資料需自行序列化(JSON、CSV、Pipe 分隔)。 | 完整頁面生命週期 | 回調請求仍執行 `Page_Init`、`Page_Load` 等,ViewState 會載入,但不執行 `Render`,效能優於整頁回發但不如 Web Service/WCF。 |
| ViewState 支援 | 可讀取 `ViewState`,但修改不會持久化回客戶端(因無 Render)。 |
| 事件驗證 | 受 `EnableEventValidation` 保護,需在 ` |
Script Callback 是 ASP.NET WebForms 邁向 AJAX 的關鍵一步,展示了「非同步伺服器呼叫」的核心概念。雖已被現代架構取代,理解其運作原理有助於維護舊系統、掌握 WebForms 請求處理管線細節。