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

ASP.NET Page_Init 執行次數迷思:ViewState 才是幕後黑手

     編輯:關於ASP.NET

許多開發者認為 Page_Init 僅執行一次,實際上每次回發都會執行。本文通過一個 DropDownList 實驗,揭示「列表項不重複新增」的真兇是 ViewState 自動還原機制,而非 Page_Init 執行頻率。

一、實驗代碼

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<form id="form1" runat="server">
  <asp:DropDownList ID="ddlTest" runat="server" />
  <asp:Button ID="btnTest" runat="server" Text="Test" />
</form>
public partial class _Default : System.Web.UI.Page {
  protected void Page_Init(object sender, EventArgs e) {
    ddlTest.Items.Add(new ListItem("Init", "Init"));
  }
  protected void Page_Load(object sender, EventArgs e) {
    ddlTest.Items.Add(new ListItem("Load", "Load"));
  }
}

二、現象觀察

  • 首次載入:DropDownList 顯示 "Init"、"Load"。
  • 點擊按鈕回發:Page_Init 再次執行(斷點驗證),但下拉列表不再新增 "Init" 項。
  • 每次回發持續新增 "Load" 項。

三、真相揭秘

Page_Init 每次回發都會執行,但 DropDownList 屬於 IPostBackDataHandler,在 LoadPostData 階段會自動還原用戶選擇與項目集合。由於 ViewState 已保存了首次載入時的 Items 集合,回發時控件直接從 ViewState 重建項目,忽略了 Page_Init 中的重複 Add 操作。

四、最佳實踐

  1. 靜態項目請在 !IsPostBack 區塊中添加,或使用聲明式標記。
  2. 動態項目應在 Page_Load 或 Page_PreRender 中根據業務邏輯重建。
  3. 理解控件的 LoadPostData 與 ViewState 交互機制,避免重複綁定導致效能損耗。

五、總結

Page_Init 並非「只執行一次」,是 ViewState 的自動還原特性讓重複添加失效。掌握頁面生命周期與控件狀態管理的協作關係,是 ASP.NET 進階開發的必修課。

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