将大List <t>从View传递给Controller的最佳方法

时间:2016-05-03 13:42:58

标签: c# asp.net-mvc model-view-controller view controller

我正在处理一个有List的View(选择bool / ID字符串/ Name string / Value decimal)。

在此视图中,用户将选择一些项目并提交表单以将其保存在数据库中。但是这个List /有大约2000个项目,而且非常慢。

我的控制器:

public ActionResult Create(List<MyClass> list) {
    foreach (var item in list) {
        if (item.Checked) {
            // something
        }
    }
}

我的观点:

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()

    @* TH /HTML *@

    @for (int r = 0; r < Model.Count(); r++)
    {
        <tr class="tr-clickable">
            @Html.HiddenFor(i => i[r].ID_User)
            <td>@Html.CheckBoxFor(i => i[r].Checked)</td>
            <td>@Html.DisplayFor(i => i[r].Anything1)</td>
            <td>@Html.DisplayFor(i => i[r].Anything2)</td>
            <td>@Html.DisplayFor(i => i[r].Value)</td>
        </tr>
    }

    @* HTML *@

    <div class="control-group margin-top-20 pull-right">
        <div class="controls">
            <input type="submit" class="btn btn-default" value="Send Form" />
        </div>
    </div>
}

有没有更好的方法在我的控制器中接收此列表?我一直在考虑通过jQuery-ajax发送列表并逐个保存它们。

你们怎么看?

3 个答案:

答案 0 :(得分:3)

我认为,您的问题不是“通过列表”,而是“逐个保存选定的列表项”。从视图发送到控制器的2k列表并不那么重(好吧,但它仍然应该工作不会太慢)。但是如果你为N个选定的项目执行N个数据库操作,那么这就是你的瓶颈。

您有两个选择:

  1. 用户选择后立即保存所选项目。
  2. 至少使用单个事务来保存项目,从而优化数据库操作。

答案 1 :(得分:2)

正如其他人所说,我首先会探索改变整个用户体验。如果您确实处于用户需要逐个选择大量记录的情况下,我会使用AJAX并将它们逐个提交给web api控制器。

这具有逐步保存进度并允许用户离开屏幕的额外好处。

答案 2 :(得分:0)

我的解决方案是jQuery Ajax:

    $('input[type="button"][data-submit]').click(function () {

        if (confirm('Anything?')) {

            var array = [];

            $('#table > tbody > tr').each(function () {
                var $tr = $(this);
                var usid = $tr.find('[data-usid]').val();
                var irvlr = $tr.find('[data-irvlr]').val();
                array.push({
                    User: usid,
                    Value: irvlr
                });
            });

            if (array.length > 0) {
                $.ajax({
                    contentType: 'application/json; charset=utf-8',
                    dataType: 'json',
                    type: 'POST',
                    url: '@Url.Action("MyAction", "MyController")',
                    data: JSON.stringify({ 'list': array }),
                    success: function (result) {
                        window.location.href = result.url;
                    },
                    error: function (ex) {
                    }
                });
            }
            else {
                alert('No items selected.');
            }

        }

    });

谢谢大家!