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

相关问题