如何获取表格行中的所有 HtmlInputText 控件?

Posted

技术标签:

【中文标题】如何获取表格行中的所有 HtmlInputText 控件?【英文标题】:How to Get All HtmlInputText Controls Within a Table Row? 【发布时间】:2012-11-29 11:50:39 【问题描述】:

我正在尝试创建一个网页来创建小型播放列表。将数据输入字段后,需要将其保存到 XML 文件中。目前该表如下所示:

<%-- song list table --%>
<table runat="server" id="table" class="table">

<%-- info row --%>
<thead>
 <tr>    
  <td>Song Title</td>
  <td>Song Artist</td>
  <td>Song Album</td>
  <td><%-- column for delete button --%></td>
 </tr>
</thead>

<%-- input rows --%>
<tbody>
 <tr>
  <td><input runat="server" placeholder="Title" type="text" /></td>
  <td><input runat="server" placeholder="Artist" type="text" /></td>
  <td><input runat="server" placeholder="Album" type="text" /></td>

  <td>
   <a href="#">
    <img src="Images/Delete.png" onmouseover="this.src='Images/Delete-Hover.png'" onmouseout="this.src='Images/Delete.png'"  />
   </a>
  </td>
 </tr>
</tbody>

</table>

新行将通过 jQuery 动态添加。当用户点击保存时,我需要将表数据写入他们特定的 XML 文件。目前我的后端代码如下所示:

//for each row
foreach (htmlTableRow row in table.Rows)

 //create row info
 textWriter.WriteStartElement("Row");

 //for each cell
 foreach (HtmlTableCell element in row.Cells)
 
  //get inputs

  //write current input to xml
 

 //close row
 textWriter.WriteEndElement();

我的问题是我的代码从哪里开始,以便能够获取每个输入的值并将它们写入 XML。

【问题讨论】:

我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。 请考虑选择以下答案之一作为正确答案,或提供更多详细信息,以便我们提供进一步的帮助。 【参考方案1】:

您需要为元素提供一个 ID,以便引用它们。此外,任何动态添加的行都无法以这种方式访问​​;那是因为它们并不作为服务器控件存在于控件树中,而是纯粹的客户端控件。您必须使用Request.Form 集合访问这些。如果您也希望它们在回发中持久存在,则必须将它们动态添加到控件树中。

如果您使用的是 JQuery,那么获取客户端上的所有值并将值发送到 Web 服务或类似的东西会更高效、更容易。

【讨论】:

同意 RE:jQuery 发布到网络服务。我在回答中提供了一个如何收集数据的示例。【参考方案2】:

我的建议是重新考虑您是如何收集数据的。我假设您将让这些信息使用$.ajax() 或类似的东西对您的服务器执行HTTP POST - 在服务器端,您想要获取Title 的所有实例, ArtistAlbum 字段,按行分组。

与其回发表格(一组显示数据但不代表数据的 UI 元素),不如考虑回发给服务器并让服务器期待 IEnumerableSong 对象,这看起来像这样:

public class Song 
    public String Album  get; set; 
    public String Artist  get; set; 
    public String Title  get; set; 

现在,当您绑定表单本身时,您可以绑定如下内容:

<table>
 <thead>
  <tr>    
   <td>Song Title</td>
   <td>Song Artist</td>
   <td>Song Album</td>
   <td><%-- column for delete button --%></td>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td><input placeholder="Title" type="text" name="Songs[0].Title" /></td>
   <td><input placeholder="Title" type="text" name="Songs[0].Artist" /></td>
   <td><input placeholder="Title" type="text" name="Songs[0].Album" /></td>
  </tr>
 </tbody>
</table>

[0] 表示法表示此元素是称为SongsIEnumerable 的一部分,并且位于索引0 处。当您的 jQuery 脚本接着添加新行时,您只需增加索引。所以 - 一个新的行会是这样的:

 <tr>
  <td><input placeholder="Title" type="text" name="Songs[1].Title" /></td>
  <td><input placeholder="Title" type="text" name="Songs[1].Artist" /></td>
  <td><input placeholder="Title" type="text" name="Songs[1].Album" /></td>
 </tr>

唯一的诀窍是确保您的索引中永远不会出现间隙。 IE。 - 如果您有 5 行,并且删除了第三行,则需要重新索引第 4 行和第 5 行(通过递减 [#] 值)。

注意:以上所有内容均假设您使用的是服务器端绑定。

如果您已经在使用jQuery,您可能还会发现使用jQuery 解析tableinput 元素并将内容作为您可以直接控制的对象发布更简单。这使您根本不必进行任何索引。一个例子是这样的:

$('#submit-button').on('click', function (ev) 
    var songs = [];
    $('#table > tbody > tr').each(function (index, element) 
        var $tr = $(element);

        var album = $tr.find('input[placeholder=Album]').val();
        var artist = $tr.find('input[placeholder=Artist]').val();
        var title = $tr.find('input[placeholder=title]').val();

        songs.push( Album: album, Artist: artist, Title: title );
    );

    $.ajax(
        url: '/my/post/url',
        type: 'POST',
        data: songs
    );
);

在服务器端,您现在将收到 HTTP POST/my/post/url 的有效负载,其中包含表中的歌曲数据 - 无需担心时髦的数据绑定语法或索引。

希望这会有所帮助。

【讨论】:

以上是关于如何获取表格行中的所有 HtmlInputText 控件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PHP 发出的表格行中使用 JavaScript 检查所有复选框

使用核心数据swift ios将实体的所有属性获取到tableview中的行中的标签

使用 Javascript/jquery 如何从选定行中的每个单元格获取值

根据同一行中的另一个值从行中选择某个值

如何忽略谷歌浏览器中右对齐表格行中的额外空白?

显示表格行中的替代列