許多開發者認為 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"));
}
}
Page_Init 再次執行(斷點驗證),但下拉列表不再新增 "Init" 項。Page_Init 每次回發都會執行,但 DropDownList 屬於 IPostBackDataHandler,在 LoadPostData 階段會自動還原用戶選擇與項目集合。由於 ViewState 已保存了首次載入時的 Items 集合,回發時控件直接從 ViewState 重建項目,忽略了 Page_Init 中的重複 Add 操作。
!IsPostBack 區塊中添加,或使用聲明式標記。Page_Load 或 Page_PreRender 中根據業務邏輯重建。LoadPostData 與 ViewState 交互機制,避免重複綁定導致效能損耗。Page_Init 並非「只執行一次」,是 ViewState 的自動還原特性讓重複添加失效。掌握頁面生命周期與控件狀態管理的協作關係,是 ASP.NET 進階開發的必修課。