C# 如何在使用UpdateModel()时消除服务器端清理的重复代码?

C# 如何在使用UpdateModel()时消除服务器端清理的重复代码?,c#,asp.net-mvc,asp.net-mvc-3,entity-framework-4,linq-to-entities,C#,Asp.net Mvc,Asp.net Mvc 3,Entity Framework 4,Linq To Entities,对于使用EF4在ASP.NET MVC 3中保存对编辑模型对象的更改的正确方法,我有点困惑,尤其是当我想在保存之前进行一些服务器端清理时。我的行动方法是: [HttpPost] public ActionResult Edit(int id, EmployeeEditModel employeeEditModel) { var originalEmployee = db.Employees.Single(c => c.Id == id); // if I don't do thi

对于使用EF4在ASP.NET MVC 3中保存对编辑模型对象的更改的正确方法,我有点困惑,尤其是当我想在保存之前进行一些服务器端清理时。我的行动方法是:

[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));
}
[HttpPost]
公共操作结果编辑(int-id,EmployeeEditModel EmployeeEditModel){
var originalEmployee=db.Employees.Single(c=>c.Id==Id);
//如果我在这里不这样做,我就无法检查随之而来的复杂模型错误
employeeEditModel.Employee.LastHireDate=employeeEditModel.Employee.LastHireDate.Date;
employeeEditModel.Employee.EmployeeNumber=employeeEditModel.Employee.EmployeeNumber.ToUpper();
if(employeeEditModel.Employee.LastHireDate
您可以看到我想要清理一些项目,例如删除
DateTime
字段中的时间部分,将另一个字段转换为大写,以及删除另一个字段中的空白(未显示)。这是一些字段的代表性示例,我可以对这些字段进行清理,而不必麻烦用户。 问题是,在我发现自己所在的代码中,我似乎不得不这样做两次(请参阅代码中的注释)。我正在更新一个编辑模型,该模型包含一些逻辑上存储在单独表中的对象


这段代码是有效的,但我不知道它应该是什么样子。在这种情况下,我应该使用
UpdateModel()
还是其他方法?如何避免在清理这两个对象时重复自己的操作?

我在这里看到两个选项:

  • UpdateModel
    开始,仅对EF对象进行清理。如果您有模型错误,在离开操作之前不要提交

  • 不要使用
    UpdateModel
    使用ViewModel对象的已清除值更新EF模型对象


  • 对于#1,如果我在进行其他检查之前(在检查
    ModelState.IsValid
    之前)尝试更新模型,我会自找麻烦吗?你害怕什么样的麻烦?''UpdateModel()')只是在模型上设置一些属性。只要你不调用'SubmitChanges()',当你离开action方法时,更改的值就会被丢弃。再深入一点,我意识到我的“清理”属于其他地方(首先是模型绑定器)。我想没有任何理由不能在方法的开头附近
    trymodeUpdate()
    。我只是通过看到其他例子得到了这样的印象,即它应该在保存之前立即出现。