首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

ASP.NET Script Callback 原理深度解析:從 ICallbackEventHandler 到 AJAX 前身

     編輯:關於ASP.NET

前言

ASP.NET 2.0 內建的 Script Callback 機制,是 AJAX 技術在 WebForms 中的早期實現。它允許瀏覽器透過 JavaScript 非同步呼叫伺服器端方法,並接收字串結果,無需整頁回發。本文從介面實作、客戶端腳本生成、生命週期三個層面深度剖析其運作原理。

核心介面:ICallbackEventHandler

public interface ICallbackEventHandler
{
 // 伺服器端處理回調邏輯,eventArgument 為客戶端傳入字串
 void RaiseCallbackEvent(string eventArgument);

 // 回傳給客戶端的字串結果
 string GetCallbackResult();
}

頁面或控制項實作此介面即可成為回調目標。

完整實作範例

1. 伺服器端 (.aspx.cs)

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;
 }
}

2. 客戶端 (.aspx)

<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="觸發回調" />

底層運作流程

  1. 頁面渲染階段:`GetCallbackEventReference` 生成 `__doCallback` 呼叫代碼,包含 `__EVENTTARGET`、`__EVENTARGUMENT` 等隱藏欄位。
  2. 客戶端觸發:`CallServer` 呼叫 `WebForm_DoCallback`(內建於 `WebResource.axd`),發起 XMLHTTP 非同步 POST 至同一頁面 URL。
  3. 伺服器端處理:
    • ASP.NET 偵測 `__CALLBACKID` 與 `__CALLBACKPARAM`。
    • 建立頁面實例,執行完整生命週期(`Init`、`Load` 等),但**略過 Render** 階段。
    • 呼叫 `RaiseCallbackEvent` 處理參數。
    • 呼叫 `GetCallbackResult` 取得結果字串。
  4. 回應:以特定格式(`|` 分隔的結果與錯誤資訊)回傳,客戶端 `WebForm_DoCallback` 解析後呼叫 `ClientCallback` 或 `ClientError`。

關鍵特性與限制

特性說明
單一字串參數`eventArgument` 僅支援單一字串,複雜資料需自行序列化(JSON、CSV、Pipe 分隔)。
完整頁面生命週期回調請求仍執行 `Page_Init`、`Page_Load` 等,ViewState 會載入,但不執行 `Render`,效能優於整頁回發但不如 Web Service/WCF。
ViewState 支援可讀取 `ViewState`,但修改不會持久化回客戶端(因無 Render)。
事件驗證受 `EnableEventValidation` 保護,需在 `` 或頁面指示詞設定。

演進:從 Script Callback 到現代 AJAX

  • ASP.NET AJAX (Atlas) → `ScriptManager` + `UpdatePanel`:封裝部分頁面更新。
  • Page Methods / `WebMethod`:靜態方法直接暴露為 JSON 端點。
  • ASP.NET Web API / ASP.NET Core MVC:RESTful API 取代回調模式。
  • 現代前端:`fetch`/`axios` 呼叫 API,前後端分離。

總結

Script Callback 是 ASP.NET WebForms 邁向 AJAX 的關鍵一步,展示了「非同步伺服器呼叫」的核心概念。雖已被現代架構取代,理解其運作原理有助於維護舊系統、掌握 WebForms 請求處理管線細節。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved