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
相关产品推荐
相关产品推荐

