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()還是其他的東西?我怎樣才能避免重複自己清理兩個物體?

回答

0

在這裏我看到兩個選項:

  1. 開始UpdateModel,做你的清理只在EF對象。如果您有模型錯誤,請不要在離開操作前進行提交。

  2. 而不是使用UpdateModel使用AutoMapper更新您的EF模型對象與清潔您的ViewModel對象的值。

+0

對於#1,如果我在進行其他檢查之前嘗試更新模型(在檢查ModelState.IsValid之前),我是否要求麻煩? – JustinStolle

+0

你害怕什麼樣的麻煩? 'UpdateModel()'只是在你的模型上設置了一些屬性。只要您不調用SubmitChanges(),當您離開操作方法時,更改的值將被丟棄。 – Jan

+0

挖掘一點,我意識到我的'清理'屬於其他地方(模型粘合劑的一開始)。我想沒有任何理由說明爲什麼我不能在方法的開始附近使用'TryModelUpdate()'。我通過看到其他例子說它應該在保存之前立即得到了印象。 – JustinStolle

相關問題