我想要捕获模型中的旧值,以便我可以在提交后与新值进行比较,并创建用户所做更改的审核日志。
我的猜测是使用带有重复旧值属性的隐藏输入框这样做是一种方式。但是想知道是否还有其他好的选择呢?
由于
答案 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);
}
我没有机会测试这个,只是一个理论:)