1

假设我有一个具有 20 多个属性的模型。

其中一些可以由用户在视图中编辑,但是出于安全原因,密码等数据不会保存在隐藏字段中,因此当我将视图模型发布到控制器时,某些属性为空

如何在不编写太多代码的情况下检查哪些属性发生了变化?

馊主意:

    [HttpPost]
    public ActionResult Edit(BigModel model)
    {
        BigModel old=db.Get(new.id);
        if(model.Property1 !=null && old.Property1 != model.Property1) old.Property1=model.Property1
        if(model.Property2 !=null && old.Property2 != model.Property2) old.Property2=model.Property2
        if(model.Property3 !=null && old.Property3 != model.Property3) old.Property2=model.Property2
        ...
        if(model.Property20 !=null && old.Property20 != model.Property20) old.Property20=model.Property20
    }
4

2 回答 2

2

看看使用ViewModel和AutoMapper 之类的东西。AutoMapper 允许您使用基于约定的方法将域模型转换为其他格式。例如,如果您的域模型上有一个名为 Start 的 DateTime 属性和一个名为 Start 的 ViewModel 字段,它将仅根据名称匹配将域模型中的 Start 值复制到 ViewModel 中的 Start 。您可以进行更复杂的映射,例如域模型中的 Start 到 ViewModel 中的 StartYear 等。

ViewModel 应该包含显示字段和您要发布的字段(可能作为子编辑模型)。然后发回一个 EditModel。

EditModel 将只包含您要更新的字段。然后可以将其映射回您的域模型或手动完成。

您可以在此处查看它的摘要。这个Stack question and answer 也说明了该技术

于 2013-09-14T22:52:32.687 回答
1

您应该使用具有视图上的确切字段(非敏感字段)的视图模型,然后调用TryUpdateModel(old)运行时会将视图模型中的字段映射到您的模型,您不必担心不会更改的字段.. EF如果值相同,则不会将它们标记为已更改。

  [HttpPost]
    public ActionResult Edit(BigViewModel model)
    {
        BigModel old=db.Get(new.id);

        UpdateModel(old);

        //db.SaveChanges();

    }

您可能想投资一个分析器,以查看发送查询时 EF 在做什么以及它正在生成什么 sql .. 您可以尝试 ORM 分析器或 EFProf ...如果您不关心付费工具,您可以尝试 Glimpse (一瞥.EF)。

于 2013-09-14T23:13:10.640 回答