C# UpdateModel未在更新";“深”;财产

C# UpdateModel未在更新";“深”;财产,c#,asp.net-mvc-3,asp.net-mvc-4,C#,Asp.net Mvc 3,Asp.net Mvc 4,我有一个ASP.NETMVC应用程序。在某一点上,我在控制器方法中得到了一个FormCollection,我想用它来更新模型。在集合中,并非所有值都是该模型的属性,要更新的属性是列表中的一个项,该列表也是另一个列表中的一个项。类似这样(我希望这是清楚的): 我在控制器中尝试了以下操作: UpdateModel(model); 问题是这不起作用,我认为这与反射不起作用这一事实有关。我去寻找,偶然发现了。所以我知道使用prefix参数可以解决这个问题。但在我的例子中不是这样,因为属性作为列表中的项

我有一个ASP.NETMVC应用程序。在某一点上,我在控制器方法中得到了一个FormCollection,我想用它来更新模型。在集合中,并非所有值都是该模型的属性,要更新的属性是列表中的一个项,该列表也是另一个列表中的一个项。类似这样(我希望这是清楚的):

我在控制器中尝试了以下操作:

UpdateModel(model);
问题是这不起作用,我认为这与反射不起作用这一事实有关。我去寻找,偶然发现了。所以我知道使用prefix参数可以解决这个问题。但在我的例子中不是这样,因为属性作为列表中的项在模型中“更深”

有人知道我怎么解决这个问题吗

更新:

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

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

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

您可以向我们展示您的模型和视图吗?如果您没有使用htmlhelper,那么您必须很好地理解命名约定,以便使模型绑定与您的模型一起工作。因此,第一步中的第一件事是向我们展示您的模型和视图。

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

  • 表单值

  • 路线数据

  • 查询字符串

  • 正是按照这个顺序

    键应匹配您的模型属性名称


    更新:
    如何将键与属性名称匹配?

    输入id将是您将获得的密钥,更改id以匹配您的属性名称,或者更好地使用帮助程序:请参阅文章:

    您不能展开集合。。。!Q95.Domain.Property可以展平。无论如何,如果OP简化了他展示的数据,他会帮自己一个忙。好的,谢谢你让我上路!现在,我如何才能使数据具有与要更新的属性名称相同的值?@Abbas,用额外的解释更新了帖子呈现的html缺失。EditorFor可以呈现任何内容。DisplayFor将呈现未发送到服务器的标签。所以你只能得到数量。2.不写入.Value=>@Html.TextBoxFor(p=>p.Quantity)'Value'是必需的,因为它是类'Quantity'的属性。该类还有一个属性“Unit”。所以“价值”应该存在,不是吗?是的,我没有给予足够的关注。我认为它是可以为空的。为什么,
    模型绑定
    中缺少了什么?什么是模型绑定?这是我从FormCollection中得到的一个值:“SegmentRequirement.MaterialRequirements[0]。Properties[0]。Quantity.value”。而不是文本框中的值。
    @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>
    
    UpdateModel(segmentRequirement, "SegmentRequirement", form.ToValueProvider());