通过findControl方法访问用户生成的控件

时间:2013-05-21 20:11:21

标签: .net vb.net

我有一个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

1 个答案:

答案 0 :(得分:1)

显然,在客户端上生成的输入将不会在服务器端显示,因为在回发生命周期期间不会重新生成这些输入,因此这不是您的方法。

如果您真的需要这个动态输入生成并希望在服务器端读取这些值,那么AJAX就是您的解决方案。您应该在服务器端的AJAX回调期间创建这些输入,并且您将能够在以下往返期间读取值,但是使用此方法,性能可能会显着降低。

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

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