例如,我的DateCreated
和Product
类都有ProductDetailModel
属性。但是,在我的编辑视图中,我没有DateCreated
输入或任何类型的存储。当我使用2013年3月17日DateCreateded
编辑产品时,DateCreated
中发布的ProductDetailModel
始终为'0001/01/01'。除非我为编辑视图添加了每个未使用字段的隐藏输入,否则我将永远丢失此信息。
是否有任何方法可以告知ProductDetailModel
中哪些属性是实际签名的值,还是只是默认值,因为它们不存在表单元素?
我是否必须编写自己的模型绑定器,在视图模型中维护更新字段的列表,以便在保存之前我只能将这些值分配回原始对象?
答案 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而不仅仅是传递你的数据模型。