【问题标题】:How do I only update properties on the original (DB) object that have been changed in the view model?如何仅更新视图模型中已更改的原始(DB)对象的属性?
【发布时间】:2013-03-17 17:08:50
【问题描述】:

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

有什么方法可以判断ProductDetailModel 中的哪些属性实际上是有符号值,还是只是默认值,因为它们不存在表单元素?

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 啊,我实际上一直在这样做,但是在写一篇文章时,我想象了另一种情况。这是在我的视图模型上,public virtual void ApplyToEntity(TEntity entity) { Mapper.Map(this, entity, GetType(), typeof(TEntity)); }`
    • 我正在使用View Model 生成的表单从用户那里获取送货地址详细信息,我想检查postedFormValues 是否!= 数据库中现有的送货地址详细信息,如果为真则更新数据库中修改后的送货详细信息,我们可以使用auto mapper 吗?如果是的话,你能举个例子还是我应该问一个单独的问题?
    【解决方案2】:

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

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

    【讨论】:

    • 是的,ViewModel 应该尽可能紧密地绑定到视图,以及使用 ViewModel 正确确定与原始值不同的任何属性值。我怀疑添加了属性更改记录,我们将使用 AutoMapper 来整理其余部分。
    猜你喜欢
    • 2019-01-20
    • 2010-10-27
    • 2018-08-15
    • 1970-01-01
    • 1970-01-01
    • 2016-10-20
    • 1970-01-01
    • 2016-05-23
    • 1970-01-01
    相关资源
    最近更新 更多