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

时间:2013-03-17 17:08:51

标签: asp.net-mvc asp.net-mvc-4 viewmodel asp.net-mvc-viewmodel

例如,我的DateCreatedProduct类都有ProductDetailModel属性。但是,在我的编辑视图中,我没有DateCreated输入或任何类型的存储。当我使用2013年3月17日DateCreateded编辑产品时,DateCreated中发布的ProductDetailModel始终为'0001/01/01'。除非我为编辑视图添加了每个未使用字段的隐藏输入,否则我将永远丢失此信息。

是否有任何方法可以告知ProductDetailModel中哪些属性是实际签名的值,还是只是默认值,因为它们不存在表单元素?

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

2 个答案:

答案 0 :(得分: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);

    ...
}

答案 1 :(得分:0)

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

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