如何在VB后台代码中获取动态创建的HTML控件的值
可行!这里是具体的解决方案
你这种通过StringBuilder动态生成客户端HTML控件的方式,完全可以在按钮点击事件中获取到它们的值——核心是利用表单提交时的Request.Form集合,因为这些客户端控件会在提交时把值传递到服务器端。下面一步步给你讲怎么实现:
第一步:修正动态生成控件的代码(关键!)
你当前的代码里,textarea的name属性固定为txt,select甚至没指定name属性——这会导致控件值无法通过Request.Form获取,因为表单提交只会携带带有name属性的控件值。
所以首先要给每个动态生成的控件加上唯一的name属性(和id对应带上i),这样后台能精准定位每个控件的值。同时,回发时要回填用户之前的输入,避免页面刷新后输入内容丢失。修改后的生成代码如下:
Dim sb As New StringBuilder Dim i As Integer = 0 sb.Append("<table>") ' 注意:回发时要确保myList有值,比如提前把它存在ViewState或Session里 For Each item As myClass In myList i += 1 ' 回发时取出用户之前输入的值,空值则用空字符串代替 Dim txtValue As String = If(Request.Form("txt" & i) IsNot Nothing, Request.Form("txt" & i), "") Dim selectValue As String = If(Request.Form("validate" & i) IsNot Nothing, Request.Form("validate" & i), "") sb.Append("<tr><td>") sb.Append("<div id='mydiv" & i & "'>" & item.myValue & "</div><br>") ' 给textarea加唯一name,并回填回发值(用HtmlEncode防止特殊字符破坏HTML) sb.Append("<textarea id='txt" & i & "' name='txt" & i & "'>" & Server.HtmlEncode(txtValue) & "</textarea></td>") sb.Append("<td><select id='validate" & i & "' name='validate" & i & "'>") sb.Append("<option value=''>Choose one</option>") ' 根据回发值设置select的选中状态 sb.Append("<option value='Yes'" & If(selectValue = "Yes", " selected", "") & ">Yes</option>") sb.Append("<option value='No'" & If(selectValue = "No", " selected", "") & ">No</option>") sb.Append("</select></td>") ' 省略部分代码 Next sb.Append("</table>") myDiv.InnerHtml = sb.ToString
另外要注意:这段生成代码不能放在If Not IsPostBack Then块里——因为ViewState不会保存myDiv.InnerHtml的内容,回发时如果不重新生成,页面上的控件会直接消失,自然也没法获取值。
第二步:在按钮点击事件中获取控件值
现在在按钮的Click事件里,你可以通过Request.Form结合循环,逐个获取每个动态控件的值:
Protected Sub btnSubmit_Click(sender As Object, e As EventArgs) Handles btnSubmit.Click Dim i As Integer = 0 ' 同样要确保回发时myList有值,比如从ViewState中取出 For Each item As myClass In myList i += 1 ' 获取textarea的输入值 Dim txtValue As String = Request.Form("txt" & i) ' 获取select的选中值 Dim validateValue As String = Request.Form("validate" & i) ' 这里可以添加你的业务逻辑,比如保存到数据库、验证值的合法性等 If Not String.IsNullOrEmpty(txtValue) Then ' 处理文本框内容 End If If validateValue = "Yes" OrElse validateValue = "No" Then ' 处理下拉框选择结果 End If Next End Sub
关键注意事项
- 保持
myList的状态:如果myList是从数据库或外部数据源获取的,回发时要确保它能被正确重建(比如把myList序列化后存在ViewState里,或者回发时重新查询数据库),否则循环次数不匹配,会导致获取的值错位。 - HTML编码:回填用户输入时一定要用
Server.HtmlEncode(),防止用户输入的特殊字符(比如<、>)破坏页面的HTML结构。 name属性唯一性:每个控件的name必须唯一,不然多个同名控件的值会被Request.Form以逗号分隔的形式返回,增加处理复杂度。
这样就能完美获取到动态生成的客户端控件的值啦!
内容的提问来源于stack exchange,提问作者Santosh
相关产品推荐
相关产品推荐

