ASP.NET中如何获取动态创建HTML控件的值?
动态生成HTML文本框的取值方案
这个问题我之前做项目时刚好碰到过,核心原因是你用StringBuilder生成的是纯HTML客户端控件(没有runat="server"),ASP.NET的服务器控件机制不会自动维护它们的状态和值,所以得直接从HTTP请求的表单数据里提取。下面给你具体的实现步骤:
第一步:生成textarea时必须指定唯一的name属性
浏览器提交表单时,是通过控件的name属性来传递值的,所以动态生成每个textarea时,一定要给它设置有规律的name(比如带索引后缀),方便后续批量获取。
示例代码(Page_Load事件):
protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { StringBuilder sb = new StringBuilder(); // 假设我们要生成3个textarea,数量也可以从数据库/配置里动态获取 int txtTotal = 3; // 把数量存到ViewState,方便回发时知道要遍历多少个 ViewState["TxtTotalCount"] = txtTotal; for (int i = 0; i < txtTotal; i++) { // 给每个textarea设置唯一的name,比如dynamicTxt_0、dynamicTxt_1 sb.Append($"<textarea name='dynamicTxt_{i}' rows='3' cols='50' placeholder='请输入内容'></textarea><br/>"); } // 把生成的HTML赋值给服务器端div myDiv.InnerHtml = sb.ToString(); } // 注意:如果需要回发后保持页面上的textarea显示,这里可以去掉!IsPostBack判断,让每次回发都重新生成HTML }
第二步:在Save按钮点击事件中获取值
我们可以通过Request.Form集合,根据之前设置的name来提取对应的值,有两种常用方式:
方式1:已知数量时,按索引遍历获取
protected void btnSave_Click(object sender, EventArgs e) { int txtTotal = (int)ViewState["TxtTotalCount"]; for (int i = 0; i < txtTotal; i++) { // 根据name从Request.Form中取值 string txtValue = Request.Form[$"dynamicTxt_{i}"]; // 这里可以添加你的业务逻辑,比如保存到数据库 Response.Write($"第{i+1}个文本框的值:{txtValue}<br/>"); } }
方式2:数量不确定时,遍历所有表单键匹配获取
如果textarea的数量是完全动态的(比如用户可以前端新增),可以遍历Request.Form的所有键,匹配我们的命名规则来取值:
protected void btnSave_Click(object sender, EventArgs e) { foreach (string key in Request.Form.AllKeys) { // 匹配我们设置的name前缀 if (key.StartsWith("dynamicTxt_")) { string txtValue = Request.Form[key]; Response.Write($"{key}的值:{txtValue}<br/>"); } } }
关键注意点
- 一定要给textarea设置
name属性:没有name的控件,浏览器不会把它的值提交到服务器,Request.Form里也找不到。 - 不要用
id代替name:表单提交是基于name的,id只是给前端JS/CSS定位用的,和服务器取值无关。 - 回发时的页面显示:如果需要回发后保持textarea的内容显示,记得在Page_Load里去掉
!IsPostBack判断,让每次页面加载都重新生成HTML(或者前端用JS保留值,不过服务器端重新生成更稳妥)。
内容的提问来源于stack exchange,提问作者Santosh
相关产品推荐
相关产品推荐

