MVC3 ModelBinding到带有索引间隙的回发集合



我在我的模型上有一个对象集合,我正在使用EditFor函数在视图中渲染,我有一个EditorTemplate负责实际渲染每个对象。

@Html.EditorFor(model => model.MyObjects)

这已经很好地工作了一段时间,现在,当你检查html,我的文本框前缀与模型属性,后面是他们来自集合的索引。

<input class="text-box single-line" id="MyObjects_2__SomeProperty" 
name="MyObjects[2].SomeProperty" type="Text" value="" />

然而,我最近开始使用ShowForEdit和ShowForDisplay属性在模型元数据的集合,在我的编辑器模板的第一行,如果ShowForEdit不是真的,我只是跳过它。

@if (!ViewData.ModelMetadata.ShowForEdit)
{
    return;
}

但是因为这些都在html中被索引了,当我试图通过回发将这个集合保存回视图模型时,由于依赖于索引编号,它失败了。当我检查它的值时,缺失索引后的集合中的每个项目都从我的视图模型中丢失。

在这种情况下,它实际上是我的集合中的第一个项目,我跳过,因为我不想让它在编辑视图上可见,但因为这个,当我回发html中的第一个索引是1(而不是像它通常是0),但这是一个问题,当你试图保存更改。使用javascript修改DOM时,这也是一个问题。

有没有人遇到过默认模型绑定器在html表示的集合中不存在一个或多个索引时读取返回数据的问题?

有模型绑定处理这个问题吗?

最近遇到了这个问题,通过将List转换为Dictionary<string,>

@foreach (var index in Model.EmailAddresses.Keys)
{
    <label asp-for="@Model.EmailAddresses[index].Email">Email</label>
    <input asp-for="@Model.EmailAddresses[index].Email" type="text" />
}

这避免了必须包含映射到索引值的隐藏输入。

有一些非常好的博客文章允许您在不需要提供从零开始的连续索引的情况下对列表进行建模绑定。请您看一下http://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2-style/
http://zahidadeel.blogspot.com/2011/05/master-detail-form-in-aspnet-mvc-3-ii.html
此外,如果你对MVVM模式和knockout js感兴趣,你可以看看steve sanderson的这个伟大的工作
更多的阅读把"编辑可变长度列表mvc样式"在谷歌,它会给你一打有用的链接

最新更新