Подтвердить что ты не робот

Как настроить конфигурацию Fluent API с проверкой на стороне клиента MVC?

Я предпочитаю работать с конфигурацией Fluent API для DataAnnotation, потому что хочу отделить модель от доступа к данным.

Я пробовал в MVC, Fluent API не работает с проверкой на стороне клиента. Вкратце, существует ли простой способ заставить Fluent API работать с проверкой на стороне клиента, как может сделать DataAnnotation?

4b9b3361

Ответ 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, было бы правильным подходом, однако я использовал это для поддержки тестового пользовательского интерфейса, запрошенного для тестирования интеграции системы вниз по течению досрочно...