Как устранить дублирующийся код для очистки на стороне сервера при использовании UpdateModel ()? - PullRequest
3 голосов
/ 23 ноября 2011

Я немного сбит с толку относительно правильного способа сохранения изменений в моем объекте редактирования модели в ASP.NET MVC 3 с использованием EF4, особенно когда я хочу выполнить некоторую очистку на стороне сервера непосредственно перед сохранением.Мой метод действия:

[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 Ответ

0 голосов
/ 23 ноября 2011

Здесь я вижу два варианта:

  1. Начните с UpdateModel и выполните очистку только для объекта EF.Если у вас есть ошибки модели, просто не выполняйте фиксацию перед выходом из действия.

  2. Вместо использования UpdateModel используйте AutoMapper для обновления объекта модели EF с помощьюочищенные значения вашего объекта ViewModel.

...