Как заставить конфигурацию Fluent API работать с проверкой на стороне клиента MVC? - PullRequest
26 голосов
/ 17 января 2012

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

Я пробовал в MVC, Fluent API не работает с проверкой на стороне клиента.Короче говоря, существует ли простой способ заставить Fluent API работать с проверкой на стороне клиента, как это делает DataAnnotation?

Ответы [ 2 ]

37 голосов
/ 17 января 2012

Нет.Свободный API - это просто отображение - правильно.Аннотации данных являются как сопоставлением, так и проверкой - неправильно.Аннотации данных - одна из худших функций кода EF, потому что при таком использовании они связывают постоянство с логикой представления и проверки.

Совет: не используйте объекты EF для представления.Используйте специальные модели представлений с аннотациями данных и позвольте вашему контроллеру подготовить модели представлений от сущностей и наоборот.Рано или поздно вы обнаружите ситуации, когда ваша проверка не соответствует 1: 1 с вашим отображением или когда вашему представлению нужно больше или меньше данных, чем указано в типе сущности.Используйте модели представлений, и эти ситуации будут обрабатываться ими.

3 голосов
/ 07 октября 2013

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...