0

我有一个 ASP.NET MVC 应用程序。在某个时刻,我在想要用于更新模型的 Controller 方法中获得了 FormCollection。在集合中,并非所有值都是该模型的属性,要更新的属性是列表中的项目,并且该列表也是另一个列表中的项目。像这样的东西(我希望这很清楚):

propertyToUpdate --> model.Items[0].Subitems[0].SomePropertyClass.Value;

我在我的控制器中试过这个:

UpdateModel(model);

问题是这不起作用,我认为这与反射不起作用的事实有关。我去搜索并偶然发现了这篇文章。所以我知道使用前缀参数可以解决问题。但在我的情况下不是,因为属性在模型中作为列表中的项目“更深”。

有谁知道我该如何解决这个问题?

更新:

这是该属性的 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>

这是足够的代码还是仍然缺少一些东西?

更新2:

好的,在所有子属性中我定义了无参数构造函数,现在我调用:

UpdateModel(segmentRequirement, "SegmentRequirement", form.ToValueProvider());

这会更新模型,但 MaterialRequirements 中的所有内容都会重新实例化......:S

4

3 回答 3

1

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

于 2011-12-06T10:25:06.680 回答
1

UpdateModel 在“深层属性”上运行良好。
问题可能是您获得的集合中的数据不等于属性名称。
检查 3 个地方以查看您从页面获得的值

  1. 表单值。

  2. 路线数据

  3. 查询字符串

完全按照这个顺序。

应该您的模型属性名称匹配。


更新:
如何将键与属性名称匹配?
输入 id 将是您将获得的键,更改 id 以匹配您的属性名称,或者更好的是,使用HtmlTextBoxFor帮助器:请参阅这篇文章:

于 2011-12-06T12:24:50.270 回答
0

您能否向我们展示您的模型和视图,如果您不使用 htmlhelper,那么您必须非常了解命名约定才能使模型绑定与您的模型一起使用。所以首先要做的就是向我们展示您的模型和视图。

于 2011-12-06T11:11:50.970 回答