如何仅更新视图模型中已更改的原始(DB)对象上的属性?



例如,我在ProductProductDetailModel类上有一个DateCreated属性。然而,在我的Edit视图中,我没有DateCreated输入,也没有任何类型的存储。当我编辑一个DateCreateded为2013/03/17的产品时,在ProductDetailModel中发布的DateCreated总是"0001/01/01"。除非我在编辑视图中为每个未使用的字段添加隐藏输入,否则我总是会丢失这些信息。

是否有任何方法告诉哪些属性在ProductDetailModel实际上是签名值,或者只是默认值,因为没有表单元素存在?

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

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);
    ...
}

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

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

相关内容

  • 没有找到相关文章

最新更新