0

我有一个 jQuery 函数,它允许用户在 id 为“textBoxContainer”的“div”中添加文本框。

所以html看起来像这样:

<div id="textBoxContainer">
    <table>
        <tr>
           <td><input type="text" name="fname" value="John"></td>
        </tr>

        <tr>
           <td><input type="text" name="lname" value="Smith"></td>
        </tr>

        <tr>
           <td><input type="text" name="city" value="New York City"></td>
        </tr>  
    </table>
</div>

我正在尝试通过这样的查找控件访问这些文本框,但它不起作用。它总是返回一个空引用错误。

有谁知道它为什么失败?谢谢

    Dim textBoxContainer As HtmlGenericControl = CType(Page.FindControl("textBoxContainer"), HtmlGenericControl)


    For Each control As HtmlInputText In textBoxContainer.Controls.Cast(Of HtmlInputText)()
        If TypeOf control Is HtmlInputText Then
            'do something
            Response.Write(control.Value)
        End If
    Next
4

1 回答 1

1

显然,在客户端生成的输入在服务器端将不可见,因为在回发生命周期中不会重新生成这些输入,因此这不是您这样做的方式。

如果您确实需要这种动态输入生成并希望在服务器端读取这些值,那么 AJAX 是您的解决方案。您应该在服务器端的 AJAX 回调期间创建这些输入,并且您将能够在随后的往返行程中读取这些值,但是使用这种方法,性能可能会明显变慢。

编辑:我的意思是,如果您使用 jquery 在客户端创建输入,那么在服务器端您将无法读取这些值。我的建议是...假设您在单击某个按钮时使用 jquery 创建输入。因此,除了单击此按钮之外,您还可以对服务器进行 AJAX 调用(只需将输入容器和按钮放在更新面板中),然后在 AJAX 回调期间,您可以通过访问您的 textboxContainer 在服务器上创建这些输入,这应该然后标记为 runat=server 并通过 textboxContainer.Controls.Add(children) 添加子级。之后,修改后的 HTML 将返回给客户端,并且在下一次回发期间,当您实际发布数据时,您将能够通过 FindControl 方法找到您的控件。

我刚刚想到的另一个想法:也许您可以隐藏字段并将所有值序列化为该输入字段的值,然后您可以反序列化服务器端的值,从而绕过 FindControl 方法(您只需要访问隐藏场地)。

于 2013-05-21T20:40:32.960 回答