0

例如,我在我的和类上有一个DateCreated属性。然而,在我的编辑视图中,我没有输入或任何类型的存储。当我使用 2013/03/17 编辑产品时,发回的产品始终是“0001/01/01”。除非我在编辑视图中为每个未使用的字段添加隐藏输入,否则我将永远丢失此信息。ProductProductDetailModelDateCreatedDateCreatededDateCreatedProductDetailModel

有什么方法可以告诉哪些属性ProductDetailModel实际上是签名值,或者只是默认值,因为它们不存在表单元素?

我是否必须编写自己的模型绑定器,在视图模型中维护更新字段的列表,以便我只能在保存之前将这些值分配回原始对象?

4

2 回答 2

3

AutoMapper有一个非常好的功能,可以让你做到这一点。您的视图模型应该只包含视图使用的属性,然后只需加载产品以从您的数据存储中更新,并使用 AutoMapper 完成仅更新属于视图模型的属性的工作:

[HttpPost]
public ActionResult Edit(EditProductViewModel viewModel)
{
    Product productToUpdate = repo.GetProduct(viewModel.Id);
    Mapper.Map<EditProductViewModel, Product>(viewModel, productToUpdate);
    // at this stage the product domain model will have only its properties updated
    // that were present in the view model (a.k.a in the view)
    repo.Update(productToUpdate);

    ...
}
于 2013-03-17T18:05:28.893 回答
0

从存储库中加载您的产品,然后覆盖视图模型中表示的字段,然后保存更改。

请注意,ViewModel 应该只包含视图所需的数据;它可能与您的数据模型有一些重叠,但不会相同。这就是为什么您使用 ViewModel 而不仅仅是传递您的数据模型的原因。

于 2013-03-17T17:10:31.703 回答