【问题标题】:Get HTML Table content to MVC Controller获取 HTML 表格内容到 MVC 控制器
【发布时间】:2019-02-07 14:50:13
【问题描述】:

更新这篇文章的底部

我有一个 HTML 表格,看起来像:

<table class="table table-hover" id="selectedProductsForContract">
    <thead>
        <tr>
            <th>Product</th>
            <th>Quantity</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td class="col-md-8">
                <p>Product name</p>
            </td>
            <td class="col-md-1">
                <input type="number" class="form-control" value="1">
            </td>
            <td class="col-md-2">
                <button type="button" class="btn btn-danger">
                    Remove
                </button>
            </td>
        </tr>

    </tbody>
</table>

我打算在选择时使用列表框中的值动态填充。我正在使用@Html.ListBox()生成列表框

@Html.ListBox("allProducts", allProductsForSupplier, new { ID = "allProductsListbox", @class = "form-control", @onclick = "AddSelectedProductToTable()" })

列表框的onclick 事件如下所示:

<script>
    function AddSelectedProductToTable() {

    var selectedProduct = $("#allProductsListbox option:selected").text();    

    $("#selectedProductsForContract").find('tbody')
        .append($('<tr>' +
            '<td class="col-md-8"><p>' + selectedProduct + '</p></td>' +
            '<td class="col-md-1"> <input type="number" class="form-control" value="1"> </td>' +
            '<td class="col-md-2">  <button type="button" class="btn btn-danger" onclick="RemoveSelectedProductFromTable(this)"> Remove </button > </td>' +
            '</tr>'));

    }
</script>

这正是我想要的,并产生以下内容:

填好表格后,我需要将选择的产品名称和数量 POST 回服务器。

我尝试了几件事,但最接近的是使用以下方法:

<script type="text/javascript">
    $(function () {
      $("#btnInsert").click(function () {
        var itemlist = [];

        //get cell values, instead of the header text.
        $("table tr:not(:first)").each(function () {
            var tdlist = $(this).find("td");
            var Item = { ID: $(tdlist[0]).html(), Name: $(tdlist[1]).html() };
            itemlist.push(Item);
        })

        $.ajax({
            url: '@Url.Action("InsertValue", "Contract")', //
            dataType: "json",
            data: JSON.stringify({ itemlist: itemlist }),
            type: "POST",
            contentType: "application/json; charset=utf-8",
            success: function (result) {
                alert("success");
            },
            error: function (xhr) {
                alert("error");
            }
        });
      });
    });
</script>

哪个 POST 返回到以下控制器:

[HttpPost]
public JsonResult InsertValue(Item[] itemlist)
{
    foreach (var i in itemlist)
    {
        //loop through the array and insert value into database.
    }
    return Json("Ok");
}

并产生以下输出:

我认为有比我现在正在做的更好的方法,但我有点迷失在这里,我认为用正则表达式或字符串操作解析 HTML 不是这里的答案......

任何人都可以建议/指导我以一种体面的方式做我想做的事吗? 有什么问题欢迎追问。

亲切的问候!

更新 感谢@Adyson,我已将 AddSelectedProductToTable() 更改为以下内容:

 $("table tr:not(:first)").each(function () {

        var tdlist = $(this).find("td");
        var input = $(tdlist[1]).find("input");

        var Item = { ID: $(tdlist[0]).text(), Name: $(input[0]).val() };
        itemlist.push(Item);   

    })

var input = $(tdlist[1]).find("input"); 已添加,我需要将这部分的 text() 更改为 val()Name: $(input[0]).val() 以便能够检索价值观。

非常感谢阿迪森!

【问题讨论】:

  • 而不是发回 HTML 的 sn-ps,只需发回 HTML 中的值...您可以使用 jQuery 提取这些值,例如使用 .text() 获取 td 中的文本(而不是 .html()),或使用 .val() 获取输入字段中的值(当然,它本身在另一个 td 中)。使用专为此目的设计的 jQuery 在客户端解析值要比在服务器上尝试解析值要容易得多。而且你也不会来回发送毫无意义的额外 HTML 标记。
  • @ADyson,我试过这个,但似乎我没有正确测试它,因为这确实有效,至少对于我的第一个值(Id)但第二个值是一个空字符串,这是逻辑由于第二个 td 标签里面有一个输入控件,所以 td 文本值为 ""。如何在 AddSelectedProductToTable() 函数中获取输入控件值?谢谢你!如果需要,您可以将其发布为答案。
  • $(tdlist[1]).find("input") 之类的东西应该得到你的文本框(假设它在你的行的索引 1 内)。这是 find() 方法的documentation。看看是否有帮助。如果你得到它的工作,我会发布一切作为答案

标签: jquery asp.net-mvc model-view-controller html-table postback


【解决方案1】:

与其回传 HTML 的 sn-ps,不如回传 HTML 中的值。

您可以使用 jQuery 提取那些,例如使用.text() 获取td(而不是.html())中的文本,或使用.val() 获取输入字段中的值(当然,它本身在另一个td 中)。

使用专为此目的设计的 jQuery 在客户端解析值比在服务器上尝试解析值要容易得多。而且你也不会来回发送毫无意义的额外 HTML 标记。

附: var tb = $(tdlist[1]).find("input") 之类的东西应该让你的文本框(假设它在你的行的索引 1 内)。然后就可以使用tb.val()提取框内输入的值了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-29
    • 2013-11-10
    • 1970-01-01
    • 2018-06-20
    相关资源
    最近更新 更多