我正在处理一个有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发送列表并逐个保存它们。
你们怎么看?
答案 0 :(得分:3)
我认为,您的问题不是“通过列表”,而是“逐个保存选定的列表项”。从视图发送到控制器的2k列表并不那么重(好吧,但它仍然应该工作不会太慢)。但是如果你为N个选定的项目执行N个数据库操作,那么这就是你的瓶颈。
您有两个选择:
答案 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.');
}
}
});
谢谢大家!