MVC:用于数据列表的编辑器
本文关键字:编辑器 列表 数据 用于 MVC | 更新日期: 2023-09-27 18:11:05
我想做一些类似于在这个问题中解释的事情:我想编辑一个数据列表。
区别在于基类不是列表。
(我使用的是VS 2013,所以它不是旧的东西。)
My view model:
public class SampleViewModel
{
// ... other properties for editing ...
// The list property
public List<SampleListItemViewModel> ItemList { get; set; }
}
public class SampleListItemViewModel
{
// For display only. It has an ID field to identify the row.
public MyEntity Item { get; set; }
// I want to modify this!
public bool IsChecked { get; set; }
}
My attempt View:
@model My.Namespace.SampleViewModel
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<!-- ... normal editing, MVC generated ... -->
<!-- BEGIN LIST EDIT -->
<table>
<tr>
<th>
Is Applicable
</th>
<!-- ... -->
</tr>
@foreach (var doc in Model.ItemList)
{
@Html.HiddenFor(modelItem => doc.Document.CRMDocumentId)
<tr>
<td>
@Html.EditorFor(modelItem => doc.IsChecked)
<!-- @Html.ValidationMessageFor(modelItem => doc.IsChecked) -->
</td>
<!-- ... other non-editable display fields, e.g. name ... -->
</tr>
}
<!-- END LIST EDIT -->
<!-- ... -->
}
当我创建视图时,它显示了我想要的一切,但是当我点击"创建"时,项目列表为空。
EDIT - More Info
控制器:
public ActionResult Create(int? id)
{
var item = // ...populate...
// I confirmed that ItemList has values.
return View(item);
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(SampleViewModel item)
{
// This is null
var list = item.ItemList;
// ignoring all else for now
return View(item);
}
要绑定复杂对象,我们需要为每个项提供索引,而不是依赖于项的顺序。这确保了我们可以明确地将提交的属性与正确的对象相匹配。
用for
环替换foreach
环:
@for (int i=0; i<Model.ItemList.Count; i++)
{
@Html.HiddenFor(modelItem => modelItem.ItemList[i].Document.CRMDocumentId)
<tr>
<td>
@Html.EditorFor(modelItem => modelItem.ItemList[i].IsChecked)
@Html.ValidationMessageFor(modelItem => modelItem.ItemList[i].IsChecked)
</td>
</tr>
}
注意:
注意,索引必须是一个连续的整数序列,从0开始,每个元素递增1
对于列表中的每个属性,您不希望用户编辑,例如UserId等为该属性添加@Html.HiddenFor(..)
,否则它将将null
发布到服务器,如果为它们创建隐藏字段,它们将不会是NULL
。
详情请参阅此处
也可参考Model Binding with List