Как настроить конфигурацию Fluent API с проверкой на стороне клиента MVC?
Я предпочитаю работать с конфигурацией Fluent API для DataAnnotation, потому что хочу отделить модель от доступа к данным.
Я пробовал в MVC, Fluent API не работает с проверкой на стороне клиента. Вкратце, существует ли простой способ заставить Fluent API работать с проверкой на стороне клиента, как может сделать DataAnnotation?
Ответы
Ответ 1
Нет. Fluent API - это просто отображение - правильно. Аннотации данных - это как отображение, так и проверка - неверны. Аннотации данных являются одной из худших особенностей кода EF, потому что, когда они используются таким образом, они сочетают постоянство с логикой представления и проверки.
Совет. Не используйте объекты EF для презентации. Используйте специальные модели просмотра с аннотациями данных и позвольте вашему контроллеру подготовить модели просмотра от объектов и наоборот. Вскоре или позже вы найдете ситуации, когда ваша проверка не соответствует 1:1 с вашим сопоставлением или где вашему представлению требуется больше или меньше данных, чем указано в типе сущности. Используйте модели просмотра, и эти ситуации будут обрабатываться ими.
Ответ 2
Я боролся с этим некоторое время сегодня, и это не является строгой проверкой клиента, так как для этого требуется поездка туда и обратно, но это позволяет вам использовать резюме резюме и сообщения в стандартном шаблоне. В рамках действия вашего контроллера вы просто переносите свой вызов SaveChanges()
в try-catch и добавляете полученные ошибки в ModelState
следующим образом:
try {
//This does not pick up fluent validation failures
if (ModelState.IsValid) {
db.Entity.Add(entity);
db.SaveChanges();
//Users want to create loads of my entities without seeing the index...
return RedirectToAction("Create");
}
} catch (DbEntityValidationException e) {
//Log errors
foreach (var result in e.EntityValidationErrors) {
foreach(var error in result.ValidationErrors){
ModelState.AddModelError(error.PropertyName, error.ErrorMessage);
}
}
}
//return to view with current model + validation errors
return View(entity)
Это, конечно, потребует немного больше работы, если вы сохраняете несколько объектов здесь.
Конечно, использование объектов View Model, как предлагает Ladislav, было бы правильным подходом, однако я использовал это для поддержки тестового пользовательского интерфейса, запрошенного для тестирования интеграции системы вниз по течению досрочно...