在MVC3中捕获模型的旧值?

时间:2012-05-24 16:42:33

标签: c# asp.net asp.net-mvc asp.net-mvc-3 entity-framework

我想要捕获模型中的旧值,以便我可以在提交后与新值进行比较,并创建用户所做更改的审核日志。

我的猜测是使用带有重复旧值属性的隐藏输入框这样做是一种方式。但是想知道是否还有其他好的选择呢?

由于

4 个答案:

答案 0 :(得分:9)

在save方法中,只需从数据库获取原始对象保存更改,然后将旧的和新的值进行比较? :)

答案 1 :(得分:2)

这听起来像标准审核。你不应该担心发生了什么变化只是捕获一切以及谁做出了改变。除非需要进行某种实时报告。

可能的审核实施:

CQRS,简而言之,它跟踪给定对象的每个更改。缺点是它是一个更加复杂的架构。

滚动分类帐。每个插入都是数据库中的新行。最新的行用于显示目的,但每次更新时,都会在数据库中插入一个新行。

另一种方法是将其保存到审计表中。

所有人都完成了工作。

答案 2 :(得分:1)

mattytommo所说的确是首选的方法

实例化用于创建新实体的新视图模型

public ActionResult Edit(int id) {
    var entity = new Entity(id); // have a constructor in your entity that will populate itself and return the instance of what is in the db
    // map entity to ViewModel using whatever means you use
    var model = new YourViewModel();
    return View(model);
}

发回更改

[HttpPost]
public ActionResult Edit(YourViewModel model) {
    if (ModelState.IsValid) {
        var entity = new YourEntity(model.ID); // re-get from db
       // make your comparison here
       if(model.LastUserID != entity.LastUserID // do whatever
       ... etc...
    }
    return View(model);
}

答案 3 :(得分:1)

您还可以将原始模型存储在视图包中并执行类似的操作......

// In the controller
public ActionResult DoStuff()
{
    // get your model
    ViewBag.OriginalModel = YourModel;
    return View(YourModel);
}

// In the View
<input type="hidden" name="originalModel" value="@Html.Raw(Json.Encode(ViewBag.OriginalModel));" />

// In the controller's post...
[HttpPost]
public ActionResult DoStuff(YourModel yourModel, string originalModel)
{
    // yourModel will be the posted data.
    JavaScriptSerializer JSS = new JavaScriptSerializer();
    YourModel origModel = JSS.Deserialize<YourModel>(originalModel);
}

我没有机会测试这个,只是一个理论:)