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

ASP.NET DropDownList 取值為空/不變?Page_Load 重複綁定是元兇

     編輯:ASP.NET 基礎

典型錯誤現場


// 前台
<asp:DropDownList ID="sectionDropDownList" runat="server"></asp:DropDownList>

// 後台 Page_Load
protected void Page_Load(object sender, EventArgs e)
{
    SourceDb db = new SourceDb();
    sectionDropDownList.DataSource = db.DatasetDb("SELECT * FROM [Section]").Tables[0].DefaultView;
    sectionDropDownList.DataTextField = "name";
    sectionDropDownList.DataValueField = "code";
    sectionDropDownList.DataBind(); // 每次請求都綁定!
}

// 按鈕點擊
protected void Button_Click(object sender, EventArgs e)
{
    string val = sectionDropDownList.SelectedValue; // 永遠是第一項!
    Response.Write(val);
}

為什麼會這樣?

  1. 用戶選擇第 3 項 → 點擊按鈕 → **PostBack**
  2. 頁面生命周期:`Page_Load` → `Button_Click`
  3. `Page_Load` 再次執行 `DataBind()` → **重置控件狀態**,選中項歸位第一項
  4. `Button_Click` 讀取 `SelectedValue` → 獲取到被重置後的第一項值

正確寫法:IsPostBack 守護


protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack) // 關鍵:僅首次加載綁定
    {
        SourceDb db = new SourceDb();
        sectionDropDownList.DataSource = db.DatasetDb("SELECT * FROM [Section]").Tables[0].DefaultView;
        sectionDropDownList.DataTextField = "name";
        sectionDropDownList.DataValueField = "code";
        sectionDropDownList.DataBind();
    }
}

進階場景:動態依賴綁定

若 DropDownList 數據依賴查詢條件(如:省份 → 城市),需在條件改變時重新綁定:


protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        BindProvinces(); // 首次綁定省份
        BindCities(ddlProvince.SelectedValue); // 綁定城市
    }
}

protected void ddlProvince_SelectedIndexChanged(object sender, EventArgs e)
{
    BindCities(ddlProvince.SelectedValue); // 省份變化時重綁城市
    // 注意:ddlProvince 需設置 AutoPostBack="true"
}

ViewState 與 DataBind 關係圖解

首次請求 (Get)          PostBack 請求
─────────────────        ─────────────────
Page_Load                Page_Load
  └─ DataBind()  ──→      ├─ IsPostBack? Yes → 跳過 DataBind
     └─ ViewState 保存      └─ ViewState 自動恢復 SelectedValue
                             
Button_Click             Button_Click
  └─ 讀取 SelectedValue     └─ 正確獲取用戶選擇

常見變體錯誤

最佳實踐檢查清單


✅ 所有 DataBind() 均在 if (!IsPostBack) 內
✅ 級聯下拉框:父控件 AutoPostBack="true",子控件在父 SelectedIndexChanged 重綁
✅ 動態參數查詢:按鈕點擊事件執行查詢並 DataBind,不在 Page_Load
✅ 大數據量下拉框:考慮虛擬滾動、AJAX 按需加載、或改用 AutoComplete
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
錯誤代碼後果修正
`if (Page.IsPostBack) DataBind();`反向邏輯:PostBack 時才綁定,首次為空`if (!IsPostBack)`
在 `Page_PreRender` 綁定ViewState 已保存,綁定覆蓋用戶選擇移至 `Page_Load` 且加 `!IsPostBack`
每次綁定前 `Items.Clear()`同 `DataBind()` 效果,清空選中狀態同樣需 `!IsPostBack` 守護