在ASP.NET中的代码隐藏中读取动态生成的HTML元素值

时间:2010-12-28 13:12:52

标签: c# asp.net code-behind

我有一个asp.net页面,我有以下标记。基本上,这个标记是通过从表中读取记录并循环遍历代码来生成的。对于表中的每条记录,都会有一个div块。

基本上,此表单用于读取/显示用户的设置。设置条目存储在表格中。

<div id='divContainer' runat='server'>

 <div id='div1' runat='server'>
    <table>
      <tr>
        <th>Name</th>
        <td><input type='text' id='txtName1' value='something' /></td>
      </tr>
       </table>
 </div>
 <div id='div2' runat='server'>
    <table>
      <tr>
        <th>Domain name</th>
        <td><input type='text' id='txtName2' value='something' /></td>
      </tr>
     </table>
 </div>
 <div id='div3' runat='server'>
    <table>
      <tr>
        <th>URL</th>
        <td><input type='text' id='txtName3' value='something' /></td>
      </tr>
      </table>
 </div>
 <div id='div4' runat='server'>
    <table>
      <tr>
        <th>Some other value is enabled ?</th>
        <td><input type='checkbox' id='chk4'  /></td>
      </tr>
      </table>
 </div>

</div>

每个输入元素的id都是唯一的。现在在代码隐藏中,我想读取每个输入元素的值以保存用户所做的更改。我怎样才能阅读这里的元素?由于标记在代码隐藏中生成为字符串并附加了外部div的INNER HTML,因此我无法读取像我们在IDE中拖放的控件那样的值。

5 个答案:

答案 0 :(得分:4)

如果在标准HTTP POST中将这些文件发送回页面,则可以阅读Request.Form NameValueCollection中的值。

基本上,所有成为表单元素的服务器控件都会像在那里一样被转换为标准HTML表单元素,尽管.NET会生成更多标记以帮助识别它们。然后它会在回发时自动将它们的值映射回服务器控件,但值本身仍然只是标准的HTTP POST,您可以手动访问它。

(这也是将表单从一个ASP .NET应用程序发布到另一个ASP .NET应用程序时使用的常用方法。)

答案 1 :(得分:1)

如果你想获取生成的控件的值,你必须做两件事。

  1. 为每个控件生成带有runat ='server'标记的输入控件(否则它们将不会包含在Request.Forms集合中。)这可能是您缺少的步骤。

    <input type='text' id='txtName1' runat='server' value='something' />

  2. 从postback上的Request.Form集合中获取值

    string txtValue1 = Request.Form["txtName1"];

  3. 真的应该那么容易。我使用DIV作为容器和一个简单的javascript将控制字符串注入innerHTML,对你的代码进行了测试。如果您遇到任何问题,可能需要调试并查看动态控件ID是否因为将它们插入命名容器或其他内容而发生了更改。

答案 2 :(得分:0)

通常,您将动态创建的输入控件(在本例中为TextBox)放置在面板控件(容器)之类的内容中。然后在用户发布数据后,您将循环该容器panel.Controls集合并检索每个TextBox文本。

请注意,在使用动态创建的控件时会有一些注意事项,因为ASP具有stateless性质。

此页面显示了如何实现此目的:

Adding Dynamic Rows in ASP.Net GridView Control with TextBoxes

答案 3 :(得分:0)

故事的主要内容是,当您在Page_Init之后动态添加控件时,POSTBACK值无法插回到这些控件中。

CF:http://www.15seconds.com/issue/020102.htmhttp://msdn.microsoft.com/en-us/library/ms178472.aspx

这里的其他一些答案建议“哦,在控件中添加一个runat = server”,但是当你在代码隐藏中创建它时,而不是在Page_Init中创建它时,那就会使ZERO产生差异。

请告诉我,如果你是如何创建控件的,或者不是你是如何使用它们的,我会在更多细节上修改这个答案。这一切都归结为你如何尝试访问这些价值观。

答案 4 :(得分:-1)

我没有测试它,但我可以建议:

使用runat =“server”(例如面板控件)在另一个控件中添加带有runat =“server”标签的动态控件。然后你可以像这样访问它们:

Textbox t = (Textbox)panel1.controls.findControl("dynamicControlId");