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

ModalPopup中后台生成的HTML Table回发后无法获取行数据

问题根源

ASP.NET回发时会重新构建页面控件树,你通过tblUpdateParameters.Rows.Add(tr)动态添加的表格行属于动态创建的内容,如果不在回发阶段重新生成这些行,控件树中不会保留它们的信息,因此后台获取到的Rows.Count为0。

解决方案

1. 保存动态行的数据源到ViewState

在显示弹窗时,先将生成表格行的数据源(比如参数集合、DataTable)存入ViewState,确保回发时能重新获取到数据:

// 显示弹窗的方法
protected void ShowParameterPopup()
{
    // 从页面其他位置获取参数数据
    List<ParamInfo> paramList = GetPageParameterData();
    // 保存数据源到ViewState
    ViewState["ParamDataSource"] = paramList;
    // 生成表格行
    BuildParameterTableRows(paramList);
    mdlPopUpParameterUpdate.Show();
}

// 提取生成表格行的逻辑为独立方法
private void BuildParameterTableRows(List<ParamInfo> paramList)
{
    tblUpdateParameters.Rows.Clear();
    foreach (var param in paramList)
    {
        TableRow tr = new TableRow();
        
        // 参数名称单元格
        TableCell nameCell = new TableCell();
        nameCell.Text = param.ParamName;
        tr.Cells.Add(nameCell);
        
        // 参数值输入单元格(用服务器控件TextBox,方便后台取值)
        TableCell valueCell = new TableCell();
        TextBox txtParamValue = new TextBox();
        txtParamValue.ID = $"txtParam_{param.ParamID}";
        txtParamValue.Text = param.ParamValue;
        valueCell.Controls.Add(txtParamValue);
        tr.Cells.Add(valueCell);
        
        tblUpdateParameters.Rows.Add(tr);
    }
}

// 自定义参数模型类,根据实际需求调整
public class ParamInfo
{
    public int ParamID { get; set; }
    public string ParamName { get; set; }
    public string ParamValue { get; set; }
}

2. 回发时重新生成表格行

在Page_Load阶段判断是否为回发,若为回发则从ViewState取出数据源,重新生成表格行,确保控件树包含这些动态元素:

protected void Page_Load(object sender, EventArgs e)
{
    if (IsPostBack)
    {
        // 回发时重新构建表格行
        if (ViewState["ParamDataSource"] != null)
        {
            List<ParamInfo> paramList = (List<ParamInfo>)ViewState["ParamDataSource"];
            BuildParameterTableRows(paramList);
        }
    }
}

3. 读取表格数据

现在在按钮点击事件中,就能正常遍历表格行或通过控件ID获取输入值:

protected void btnUpdateUpdateParameters_Click(object sender, EventArgs e)
{
    List<ParamInfo> updatedParams = new List<ParamInfo>();
    List<ParamInfo> originalParams = (List<ParamInfo>)ViewState["ParamDataSource"];

    foreach (var param in originalParams)
    {
        // 根据ID找到对应的输入框
        TextBox txtValue = (TextBox)tblUpdateParameters.FindControl($"txtParam_{param.ParamID}");
        if (txtValue != null)
        {
            param.ParamValue = txtValue.Text;
            updatedParams.Add(param);
        }
    }

    // 使用updatedParams更新页面字段或写入数据
    UpdatePageData(updatedParams);
}

替代方案(纯HTML元素场景)

如果表格行是纯HTML(未使用服务器控件),需要给每个输入元素添加name属性,然后通过Request.Form读取提交的数据:

<!-- 动态生成HTML行示例 -->
<tr>
    <td>参数1</td>
    <td><input type="text" name="param_1" value="xxx"></td>
</tr>
protected void btnUpdateUpdateParameters_Click(object sender, EventArgs e)
{
    string param1Value = Request.Form["param_1"];
    // 其他参数同理
}

这种方式可靠性低于服务器控件方案,仅适合简单场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 00:23:10