我有一个ASP.NET MVC应用程序。在某个时刻,我在Controller方法中得到一个FormCollection,我想用它来更新模型。在集合中,并非所有值都是该模型的属性,要更新的属性是列表中的项目,该列表也是另一个列表中的项目。这样的事情(我希望这很清楚):
propertyToUpdate --> model.Items[0].Subitems[0].SomePropertyClass.Value;
我在我的控制器中试过这个:
UpdateModel(model);
问题是这不起作用,我认为它与反射不起作用的事实有关。我去搜索并偶然发现了this article。所以我理解使用prefix-parameter可以解决问题。但不是在我的情况下,因为属性在模型中作为列表中的项目“更深”。
有谁知道如何解决这个问题?
更新
这是属性的EditorTemplate:
@model Q95.Domain.Property
<li>
@Html.DisplayFor(p => p.Description) :
@Html.DisplayFor(p => p.Quantity.Value)
@Html.DisplayFor(p => p.Quantity.Unit.Description)
<br />
@Html.TextBoxFor(p => p.Quantity.Value)
</li>
此模板的调用方式如下:
<ul>
@Html.EditorFor(model => model.SegmentRequirement.MaterialRequirements[j].Properties)
</ul>
这个代码是否足够或者还有什么东西丢失了?
UPDATE2:
好的,在所有子属性中我定义了无参数构造函数,现在我调用:
UpdateModel(segmentRequirement, "SegmentRequirement", form.ToValueProvider());
这会更新模型,但MaterialRequirements中的所有内容都会重新实例化......:S
答案 0 :(得分:1)
也许您应该创建展平的ViewModel,然后使用它来填充视图,然后将其与真实模型同步。
答案 1 :(得分:1)
UpdateModel可以正常使用“深层属性” 问题可能是你得到的集合中的数据不等于属性名称 检查3个地方以查看从页面中获得的值
表单值。
路线数据
查询字符串
确切的顺序。
键应匹配您建模属性名称。
<强>更新强>
如何将键与属性名称匹配?
输入ID将是您将获得的密钥,更改ID以匹配您的属性名称,甚至更好,使用HtmlTextBoxFor帮助:请参阅this文章:
答案 2 :(得分:0)
您能否向我们展示您的模型和视图,如果您不使用htmlhelper,则必须非常好地理解命名约定,以使模型绑定与您的模型一起工作。所以首先要向我们展示你的模型和视图。