You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Web Forms动态TextBox回发后丢失输入值求助

ASP.NET Web Forms动态TextBox回发值丢失问题解决

问题根源

ASP.NET Web Forms的ViewState加载发生在Page_Load事件之前,你当前仅在按钮点击事件(生命周期后期)中生成动态控件,回发时页面初始化阶段没有重建这些控件,导致ASP.NET无法将ViewState中保存的值映射到对应控件,最终输入值丢失。

解决方案

必须在页面生命周期的早期阶段(如Page_Init或Page_Load)重新创建所有动态控件,且保证控件ID与之前完全一致;同时每次生成控件前清空容器的现有控件,避免重复添加。

修改后的完整后台代码

protected void Page_Init(object sender, EventArgs e)
{
    // 页面初始化时重建动态控件,确保ViewState能正确恢复值
    int controlsCount = (int)(ViewState["ControlsCount"] ?? 0);
    GenerateControls(controlsCount);
}

protected void btnAddTextBox_Click(object sender, EventArgs e)
{
    int controlsCount = (int)(ViewState["ControlsCount"] ?? 0);
    controlsCount++;
    ViewState["ControlsCount"] = controlsCount;
    GenerateControls(controlsCount);
}

protected void btnRemoveTextBox_Click(object sender, EventArgs e)
{
    int controlsCount = (int)(ViewState["ControlsCount"] ?? 0);
    if (controlsCount > 0)
    {
        controlsCount--;
        ViewState["ControlsCount"] = controlsCount;
        GenerateControls(controlsCount);
    }
}

string[] baseIds = new string[] { "DSrNo", "DDescShBx", "DTtlBx", "DBNo", "DExpDt", "DHsnCd", "DTtlQty", "DRteUsd", "DAmtUsd" };
private void GenerateControls(int controlsCount)
{
    string[] labelTexts = new string[] { "Sr No.", "Desc. of Shipper Box", "Total Box", "Batch No", "Exp Date", "HSN Code", "Total qty",
        "Rate in Usd", "Amount in USD" };

    string[] colClasses = new string[] { "col-12 col-lg-1 mb-3", "col-12 col-lg-2 mb-3", "col-12 col-lg-1 mb-3", "col-12 col-lg-1 mb-3",
        "col-12 col-lg-1 mb-3", "col-12 col-lg-1 mb-3", "col-12 col-lg-1 mb-3", "col-12 col-lg-2 mb-3", "col-12 col-lg-2 mb-3" };

    // 清空容器现有控件,避免重复添加导致控件树混乱
    pnlTextBoxes.Controls.Clear();

    for (int i = 0; i < controlsCount; i++)
    {
        Panel row = new Panel();
        row.CssClass = "row";

        for (int j = 0; j < baseIds.Length; j++)
        {
            TextBox txt = new TextBox();
            txt.ID = $"{baseIds[j]}_{i}";
            txt.CssClass = "form-control";
            txt.EnableViewState = true; // 显式启用ViewState,确保值被保存

            Label lbl = new Label();
            lbl.Text = labelTexts[j];
            lbl.ID = $"lbl{baseIds[j]}_{i}";

            Panel col = new Panel();
            col.CssClass = colClasses[j]; // 修复之前CSS类重复拼接的错误
            col.Controls.Add(lbl);
            col.Controls.Add(txt);

            row.Controls.Add(col);
        }

        pnlTextBoxes.Controls.Add(row);
    }
}

关键修改说明

  1. Page_Init阶段重建控件:这是ViewState加载的核心阶段,此时创建控件,ASP.NET会自动将ViewState中保存的值绑定到对应ID的控件上。
  2. 清空容器控件:每次生成控件前清空pnlTextBoxes.Controls,避免多次生成导致控件重复,保证控件树结构正确。
  3. 保持控件ID一致:动态控件的ID必须与之前生成的完全相同,ViewState通过ID匹配值,ID不一致会导致值无法恢复。
  4. 修复CSS类拼接错误:之前的代码会重复添加col-lg-前缀,现在直接使用完整的CSS类字符串。

内容的提问来源于stack exchange,提问作者Dhrumil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 11:43:20