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);
    }

MVC:用于数据列表的编辑器

要绑定复杂对象,我们需要为每个项提供索引,而不是依赖于项的顺序。这确保了我们可以明确地将提交的属性与正确的对象相匹配。

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