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