5

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

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

4

2 回答 2

1

最近遇到了这个问题,并通过将 List 转换为 Dictionary<string, model> 以 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" />
}

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

于 2020-10-14T16:46:08.900 回答
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 模式和淘汰赛 js 感兴趣,您可以查看steve sanderson
的这项出色工作mvc 风格”在谷歌,它会给 ua 十几个有用的链接

于 2011-07-28T04:59:42.553 回答