0

我有一个模型,其中包含子项目列表,如下所示:

class MyObj {
    public string Name {get;set;}
    public List<mySubObject> Items {get;set;} 
}

class mySubObject { 
    public string Name {get;set;}
    public int Order {get;set;}
}

现在,当我使用 for 循环和 editorFor 渲染列表时,我得到的 html 是这样的:

<input type="text" name="Items[0].Name">
<input type="Number" name="Items[0].Order">
<input type="text" name="Items[1].Name">
<input type="number" name="Items[1].Order">
...
<input type="text" name="Items[9].Name">
<input type="number" name="Items[9].Order">

现在想象一下通过 jQuery 从 HTML 中删除第一个元素,因为我不再希望它出现在我的列表中,然后保存列表。返回的数据没有第一个[0]元素,并且从 1 到 9 的所有元素都转到服务器,但是模型绑定失败并且它(在服务器上)显示项目列表是null

我究竟做错了什么 ?

这是默认模型绑定器的错误吗?

4

1 回答 1

0

我究竟做错了什么 ?

在索引中留下漏洞。

这是默认模型绑定器的错误吗?

不,这是设计使然。您不应该在索引中留下任何漏洞。

一种可能性是在删除一行时重新计算索引,但您必须为此编写大量废话 JavaScript。

我建议您使用不同的方法。而不是使用顺序索引使用Guids。Phil Haack 在以下博客文章中详细介绍了该方法:http: //haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx(非顺序索引部分)。

Steven Sanderson 在这篇文章中说明了一个很好的小帮手,可以让你很容易地实现这一点:http: //blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc -2风格/

你可以这样使用:

@using(Html.BeginCollectionItem("Items")) 
{
    for (var i = 0; i < Model.Items.Count; i++)
    {
        @Html.EditorFor(x => x.Name)
        @Html.EditorFor(x => x.Order)
    }
}

它将生成以下内容:

<input type="hidden" name="Items.Index" value="F769E33C-4D07-4586-8D9C-63D386C641FA" />
<input type="text" name="Items[F769E33C-4D07-4586-8D9C-63D386C641FA].Name">
<input type="Number" name="Items[F769E33C-4D07-4586-8D9C-63D386C641FA].Order">

<input type="hidden" name="Items.Index" value="F4A4A9BB-4427-497E-BFD5-3CDE1F46095B" />
<input type="text" name="Items[F4A4A9BB-4427-497E-BFD5-3CDE1F46095B].Name">
<input type="number" name="Items[F4A4A9BB-4427-497E-BFD5-3CDE1F46095B].Order">

...

现在,您可以使用 javascript 在客户端上随意添加/删除行,而不必担心它会破坏集合的模型绑定。

于 2013-09-23T11:13:18.937 回答