3
我对使用EF4在ASP.NET MVC 3中保存对编辑模型对象所做的更改的正确方法感到有点困惑,特别是当我想在保存前进行一些服务器端清理时。我的操作方法是:如何消除使用UpdateModel()时服务器端清理的重复代码?
[HttpPost]
public ActionResult Edit(int id, EmployeeEditModel employeeEditModel) {
var originalEmployee = db.Employees.Single(c => c.Id == id);
// if I don't do this here, I can't check for complex model errors that follows
employeeEditModel.Employee.LastHireDate = employeeEditModel.Employee.LastHireDate.Date;
employeeEditModel.Employee.EmployeeNumber = employeeEditModel.Employee.EmployeeNumber.ToUpper();
if (employeeEditModel.Employee.LastHireDate < employeeEditModel.Employee.OriginalHireDate) {
ModelState.AddModelError("Employee.LastHireDate", "Last Hire Date cannot occur before Original Hire Date.");
}
if (ModelState.IsValid) {
UpdateModel(originalEmployee, "Employee");
// if I don't do this here, these changes won't be saved
originalEmployee.LastHireDate = originalEmployee.LastHireDate.Date;
originalEmployee.EmployeeNumber = originalEmployee.EmployeeNumber.ToUpper();
db.SaveChanges();
return RedirectToAction("Index");
}
return View(getEmployeeEditModel(id));
}
你可以看到我想要清理了几个项目,如在DateTime
场脱落的时间部分,转换另一种为大写,并修剪空白了另一个(未显示)。这是我可以净化的一些领域的代表性样本,我不需要打扰用户。 问题是我似乎不得不在我发现自己的代码中执行两次代码(请参阅代码中的注释)。我正在更新一个编辑模型,其中包含一些逻辑上存储在单独表格中的对象。
此代码有效,但不是我应该知道的。我应该在这种情况下使用UpdateModel()
还是其他的东西?我怎样才能避免重复自己清理两个物体?
对于#1,如果我在进行其他检查之前尝试更新模型(在检查ModelState.IsValid之前),我是否要求麻烦? – JustinStolle
你害怕什么样的麻烦? 'UpdateModel()'只是在你的模型上设置了一些属性。只要您不调用SubmitChanges(),当您离开操作方法时,更改的值将被丢弃。 – Jan
挖掘一点,我意识到我的'清理'属于其他地方(模型粘合剂的一开始)。我想没有任何理由说明为什么我不能在方法的开始附近使用'TryModelUpdate()'。我通过看到其他例子说它应该在保存之前立即得到了印象。 – JustinStolle