MVC3 ModelBinding回收了一个带有索引间隙的集合

时间:2011-07-27 23:44:00

标签: asp.net-mvc asp.net-mvc-3 model-binding modelbinders defaultmodelbinder

我的模型上有一组对象,我使用EditFor函数在View中渲染,我有一个EditorTemplate,它负责实际渲染每个对象。

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

现在已经运行了一段时间了,当你检查html时,我的文本框以model属性为前缀,后面跟着它们来自的集合的索引。

<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中编入索引,当我尝试通过回发将此集合保存回viewmodel时,由于依赖索引编号而失败。当我检查它的值时,我的视图模型中缺少索引后的每个项目。

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

当html表示集合中的一个或多个索引不存在时,是否有其他人遇到默认模型绑定器读取回发数据的能力?

是否有处理此问题的模型粘合剂?

2 个答案:

答案 0 :(得分:1)

最近遇到了这个问题,并通过将列表转换为以GUID为键的Dictionary 来解决。

@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" />
}

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

答案 1 :(得分:0)

有一些非常好的博客文章允许您模型绑定到列表而无需提供基于零的连续索引。请看看 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模式和淘汰赛感兴趣,您可以通过steve sanderson来检查这项伟大的工作 如需更多阅读,请在google中添加“编辑varibale长度列表mvc样式”,它将为您提供十几个有用的链接