例如,我在Product
和ProductDetailModel
类上有一个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而不是仅仅传递数据模型。