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

ASP.NET 程式設計入門隨想:PostBack、事件、委派、IPostBackEventHandler 深度解析

     編輯:關於ASP.NET

以「信客」隱喻 ASP.NET PostBack 機制:瀏覽器發起 HTTP POST (信客送信) → 伺服器識別觸發控件 (UniqueID) → 呼叫 IPostBackEventHandler.RaisePostBackEvent (口信) → 觸發控件事件 (委派/回調)。本文深度剖析此流程與自訂控件實作。

PostBack 與事件模型

  • PostBack:表單提交至同一頁面,頁面生命週期重跑。
  • 事件源:實作 IPostBackEventHandler 的控件 (Button, LinkButton 等)。
  • 事件引數:RaisePostBackEvent(string eventArgument) 接收客戶端傳回參數。
  • 委派/回調:.NET 事件模式 public event EventHandler Click; protected virtual void OnClick(EventArgs e)。

自訂 PostBack 控件範例 (MyButton)

using System;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace Essay
{
    public class MyButton : WebControl, IPostBackEventHandler
    {
        // 屬性存 ViewState
        public virtual string Text
        {
            get => (string)ViewState["Text"] ?? string.Empty;
            set => ViewState["Text"] = value;
        }

        // 渲染含 UniqueID 的 submit 按鈕
        protected override void Render(HtmlTextWriter writer)
        {
            writer.Write($"");
        }

        // 事件定義
        public event EventHandler Click;

        // IPostBackEventHandler 實作:將 PostBack 映射為 Click 事件
        void IPostBackEventHandler.RaisePostBackEvent(string eventArgument)
        {
            OnClick(EventArgs.Empty);
        }

        protected virtual void OnClick(EventArgs e)
        {
            Click?.Invoke(this, e);
        }
    }
}

關鍵點

  1. UniqueID:控件在表單中的名稱,伺服器靠它找到觸發控件。
  2. ClientID:客戶端 HTML id,供 JS 操作用,與 UniqueID 不同。
  3. ViewState:跨 PostBack 保持屬性值 (如 Text)。
  4. 事件模式:發布-訂閱,編譯期不綁定處理器,執行期動態訂閱 (委派)。

頁面處理流程簡圖

HTTP POST (含 __EVENTTARGET=控件UniqueID)
    ↓
Page.LoadPostData (載入表單值)
    ↓
Page.RaisePostBackEvent (依 __EVENTTARGET 找控件 → 呼叫 RaisePostBackEvent)
    ↓
控件.OnClick → 觸發 Click 事件 → 執行使用者處理器
    ↓
Page.PreRender → Render → Response

理解此流程,才能掌控複雜 PostBack 場景、自訂控件開發、AJAX 部分更新原理。

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