如何在MVC视图中批量更新表而不是一次更新一个记录?

时间:2016-08-11 17:08:07

标签: c# jquery asp.net-mvc asp.net-mvc-5

我用所显示的措辞提出问题,以便表明我真正想做的事情。虽然我可以提出这样的问题:“如何使用jQuery读取表格的内容并转换为IEnumerable<ModelName>类型?”我会隐藏重要的背景,这可能暗示一种更好的方法来实现这一结果,这正是我真正希望的。

当从模型中自动搭建控制器和视图(使用实体框架)时,生成的视图允许通过单击行,编辑记录和返回索引一次编辑一条记录。对于许多情况而言,这是所需的功能。

但是当人们想要在表格中大量更新价值时,就好像有人在电子表格上工作一样。例如,切换一些复选框并单击“更新”,就像在这种情况下一样。

enter image description here

我的一个工作思路是使用jQuery:

  1. 读取表格数据并转换为IEnumerable<SampleModel>类型的变量。
  2. 将表内容传递给控制器​​中的public void方法。
  3. 通知用户操作成功并刷新页面。
  4. 我真的被#1困住了,因为我需要能够将IEnumerable<SampleModel>类型的对象传递给控制器​​的方法,而且我不知道该怎么做。

    控制器:

    public void UpdateTable(IEnumerable<SampleModel> query)
    {
        // I'm verifying existence before writing code here.
        // This is where I'll be updating the database.
        Debug.WriteLine("Test for query existence " + query.Count());
    }
    

    查看:

    @model SampleSystem.Areas.FakeName
    
    <button id="UpdateTableTop">Update</button>
    
    <table class="table">
        <tr>
            <th></th>
            <th>
                @Html.DisplayNameFor(model => model.Reconciled)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.StudentID)
            </th>
        </tr>
    
        @foreach (var item in Model)
        {
            <tr>
                <td>
                    @Html.HiddenFor(modelItem=>item.ID)
                </td>
                <td>                    
                    @Html.CheckBoxFor(modelItem => item.Reconciled)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.StudentID)
                </td>               
            </tr>
        }
    </table>
    
    @section scripts {
        <script>
            $(function () {
                $("UpdateTableTop").click(function (e) {                
                    $.ajax({
                        url: '@Url.Action("UpdateTable")',
                        data: 
                        /* ...  Need to convert table 
                         *      to IEnumerable<SampleModel>  ...
                        */,
                        success: function (){
                            console.log("Success!");
                        }
                    });
                });
            });
        </script>
    }
    

2 个答案:

答案 0 :(得分:1)

这不是一个完整的答案,但应引导您朝着正确的方向前进。

SampleModel

在服务器端,模型绑定将根据发布的值创建{1}

答案 1 :(得分:1)

除了之前的答案之外,还有一种可能的方法。 将数据属性添加到复选框

@Html.CheckBoxFor(modelItem => item.Reconciled, new { data_myid = item.ID }) /* the _ gets converted to - */

稍后,使用jQuery检索所有选中的复选框。

var selectedIds = new Array();
$( "input:checked" ).each(function(eachCheckbox){
    selectedIds.push($(eachCheckbox).data('myid'));// could serialize to JSON but if the update action is the same for all id's then there is no need for additional data transfer
});

然后在ajax调用中将selectedIds作为数据传递,并在成功时通知。

在服务器端:

public void UpdateTable(IEnumerable<int> query) /* change type to int */
{
    Debug.WriteLine("Test for query existence " + query.Count());
}