【问题标题】:MVC3 ModelBinding to a collection posted back with index gapsMVC3 ModelBinding 到带有索引间隙回发的集合
【发布时间】:2011-07-27 23:43:59
【问题描述】:

我的模型上有一组对象,我正在使用 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 表示的集合中的一个或多个索引不存在时,是否有其他人遇到过默认模型绑定器读取回发数据的问题?

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

【问题讨论】:

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


【解决方案1】:

最近遇到这个问题,通过将 List 转换为 Dictionary 并以 GUID 作为键来解决它。

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

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

【讨论】:

  • 这可能不适用于旧版本的 asp.net-mvc,这是我最初遇到此问题时使用的。较新的版本(甚至 asp.net-core)很可能已经简化了这一点,但我没有尝试删除 Index 属性来查看。还值得注意的是,使用建议的链接中描述的帮助方法具有将视图模型遍历链向下级联的额外好处,以便 EditorTemplates、DisplayTemplates 等都可以使用它。您必须明确指定索引的位置。
【解决方案2】:

有一些非常好的博客文章允许您对列表进行模型绑定,而无需提供从零开始的连续索引。请看看 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 模式和淘汰 js 感兴趣,您可以通过steve sanderson查看这项出色的工作
如需更多阅读,请在 google 中输入“编辑变量长度列表 mvc 样式”,它将为您提供十几个有用的链接

【讨论】:

  • 我对您提供的一些链接进行了排序,但其中大多数都回复了一些小代码示例,其余的包含在一个较大的项目下载中,您必须筛选才能找到相关的位,我个人觉得这很烦人。但是,我确实修改了您建议的搜索词,并发现此帖子有所帮助。 link 具有讽刺意味的是,这与我在 MVC2 中所做的非常接近,但后来发现对自动生成索引的支持并最终改用它
猜你喜欢
  • 1970-01-01
  • 2011-11-27
  • 2013-05-29
  • 1970-01-01
  • 2012-06-23
  • 1970-01-01
  • 1970-01-01
  • 2011-08-08
  • 2013-02-25
相关资源
最近更新 更多