【问题标题】:Dynamically removing rows from an html table, using Javascript使用 Javascript 从 html 表中动态删除行
【发布时间】:2016-03-11 14:43:30
【问题描述】:

我是 MVC 和 JavaScript 的新手,所以请原谅我的基本问题。我正在编写一个显示多行数据的视图,并在每行的末尾显示一个删除按钮。单击时,该按钮将运行一些 JavaScript,该 JavaScript 使用 .remove() 删除该行。

当我单击“删除”按钮时,该行被删除,但是当我返回控制器时,被删除行下方的任何行都不会传输回控制器,并且计数比我删除的行少一。例如,如果我有 6 行并删除第 4 行,当我提交回控制器时,计数为 3 并且缺少第 5 行和第 6 行。不知道为什么。下面是我的视图和控制器。

任何帮助将不胜感激。

查看

@using (Html.BeginForm("Edit", "Contacts", FormMethod.Post))
{
    <table>
        <tr>
            <th><label>Last Name</label></th>
            <th><label>First Name</label></th>
            .... // more table headings
            <th></th>
        </tr>
        @if (Model != null && Model.Count > 0)
        {
            int j = 0;
            foreach (var i in Model)
            {
                <tr>
                    <td>
                        @Html.TextBoxFor(a => a[j].LASTNAME)
                        @Html.HiddenFor(a => a[j].DOB_NBR)
                        @Html.ValidationMessageFor(a => a[j].LASTNAME)
                    </td>
                    <td>
                        @Html.TextBoxFor(a => a[j].FIRSTNAME)
                        @Html.ValidationMessageFor(a => a[j].FIRSTNAME)
                    </td>
                    .... // more controls
                    <td><button type="button" id="btnDelete" class="deleteContact btn btn btn-danger btn-xs">Remove</button></td>
                </tr>
                j++;
            }
        }
    </table>
    <input type="button" class="add-button btn btn-default" name="add" value="Add" />
    <input type="submit" name="submitAction" value="Submit" class="btn btn-primary" onclick="return confirm('Please double check all information before submitting.   Submit Notification?')" />
}
@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}
<script src="~/Scripts/jquery-1.10.2.min.js"></script>
<script src="~/Scripts/jquery.validate.min.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>
<script type="text/javascript">
    $(document).on("click", ".deleteContact", function () {
        $(this).closest("tr").remove();
    });
</script>

控制器

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(string submitAction, List<ENTITY_CONTACTS> entity_Contacts)
{
    // entity_Contacts is not bound with all items in the collection
}

【问题讨论】:

    标签: javascript asp.net-mvc asp.net-mvc-4


    【解决方案1】:

    默认情况下,DefaultModelBinder 只会在索引器从零开始且连续时绑定集合。在您的情况下,当您删除第 4 行时,您的索引器是 0、1、2、4 和 5,因此只有前 3 行是绑定的。您可以通过为索引器添加隐藏输入来覆盖此行为,这允许DefaultModelBinder 匹配非连续索引器。

    将循环更改为

    for (int i = 0; i < Model.Count; i++) // do not use a foreach loop
    {
        <tr class="contacts-record">
            <td>
                <input type="hidden" name="Index" value="@i" /> // add this
                @Html.TextBoxFor(a => a[i].LASTNAME)
                @Html.HiddenFor(a => a[i].DOB_NBR)
                @Html.ValidationMessageFor(a => a[i].LASTNAME, "", new { @class = "text-danger" })
            </td>
            .... // other td elements
        <tr>
    }
    

    有关绑定到集合的更多信息,请参阅Model Binding To A List,如果您还希望将项目动态添加到集合中,请参阅答案herehere

    附注:从“删除”按钮中删除 id 属性。您创建的重复 id 属性是无效的 html。还要删除jquery.validate.min.jsjquery.validate.unobtrusive.min.js 的脚本,因为您已经使用@Scripts.Render("~/bundles/jqueryval") 添加了它们,但是您需要确保首先呈现jquery-1.10.2.min.js,最好使用@Scripts.Render("~/bundles/jquery")。另外,所有的脚本都应该在@section Scripts {里面

    【讨论】:

    • 感谢您的回复正是我想要的。我开始使用 .hide() 创建删除,但您的响应要容易得多。我还有一个问题。下面是我的添加功能。如何为 Index 分配新值?
    • 如果你有一个新问题,那么你需要问一个新问题,但在你这样做之前,我建议你看一下答案herehere以了解如何动态添加和删除收藏品 - 我刚刚注意到我的答案中已经有了这些链接:)
    • 不仅如此,我刚刚意识到我在你的previous question 中给了你这些链接,我指出你接受的答案并不能解决你的问题
    • 说真的,当您发现这个正确答案没有用时,您需要我对另一个问题的帮助吗?
    猜你喜欢
    • 2016-09-27
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    • 2021-08-28
    • 1970-01-01
    相关资源
    最近更新 更多