ASP.NET mvc4 - 确定编辑模型的哪些属性

时间:2013-10-16 16:27:56

标签: c# asp.net-mvc-4 edit

在我的应用程序中,我想记录模型的某些属性的每个更改到数据库。所以,假设我有这个模型:

public class  MyModel
{
    public int x1 {get; set;}
    public int x2 {get; set;}
}

在这个模型中我有编辑动作:

[HttpPost]
public ActionResult Edit(MyModel model)
{
    if (ModelState.IsValid)
    {
        db.Entry(model).State = EntityState.Modified;
        db.SaveChanges();
        return RedirectToAction("Index");
    }
    return View(model);
}

在这个编辑操作中,我想确定属性x1是否已更改,如果是,我将在另一个表中创建日志,但我不知道,如何确定,哪个属性已更改。任何人都可以给我一些建议怎么做?

提前谢谢。

3 个答案:

答案 0 :(得分:0)

不,MVC中没有任何事情可做。 ASP.NET WebForms通过在视图状态中包含字段的原始值来实现这一点,但是在其核心MVC中包含HTTP的无状态性并不会这样做。

答案 1 :(得分:0)

所以我对数据库进行了额外的打击,就像这样:

    [HttpPost]
    public ActionResult Edit(MyModel model)
    {
        if (ModelState.IsValid)
        {
            MyModel m = db.MyModels.Find(model.MyModelId);
            if (m.x1 != model.x1)
                //Fire log function here

            db.Entry(model).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(model);
    }

但如果有更好的解决方案,我会很高兴听到它。谢谢。

答案 2 :(得分:0)

您应该能够在部分DBContext类中执行以下操作:

public bool HasChanges(MyEntity myentity)
{
  return this.ChangeTracker.Entries().Any(e => e.Entity == myentity &&
    (this.Entry(myentity).GetDatabaseValues().GetValue<DateTimeOffset>("aDateField") != myentity.aDateField)
  );
}

如果特定字段已更改,则返回true。您可以将其扩展为使用匿名类型,但我不确定如何执行此操作。

如果你想检查实体是否已被更改,那么你可以将以下代码与上面的代码结合起来,给你类似的东西。

public bool HasChanges()
{
  return this.ChangeTracker.Entries().Any(e => e.State == EntityState.Added
                                          || e.State == EntityState.Modified
                                          || e.State == EntityState.Deleted);
}

可能有更好的方法可以做到这一点,但它适用于特定的实体。