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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:06:42