UpdateModel未更新“deep”属性

时间:2011-12-06 10:06:49

标签: c# asp.net-mvc-3 asp.net-mvc-4

我有一个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

3 个答案:

答案 0 :(得分:1)

也许您应该创建展平的ViewModel,然后使用它来填充视图,然后将其与真实模型同步。

答案 1 :(得分:1)

UpdateModel可以正常使用“深层属性” 问题可能是你得到的集合中的数据不等于属性名称 检查3个地方以查看从页面中获得的值

  1. 表单值。

  2. 路线数据

  3. 查询字符串

  4. 确切的顺序。

    匹配您建模属性名称


    <强>更新
    如何将键与属性名称匹配?
    输入ID将是您将获得的密钥,更改ID以匹配您的属性名称,甚至更好,使用HtmlTextBoxFor帮助:请参阅this文章:

答案 2 :(得分:0)

您能否向我们展示您的模型和视图,如果您不使用htmlhelper,则必须非常好地理解命名约定,以使模型绑定与您的模型一起工作。所以首先要向我们展示你的模型和视图。