Бритвенно-частичная валидация модели MVC 3
В настоящее время я работаю над проектом в MVC 3, в котором я использую Entity Framework для сохранения одной модели данных в двух представлениях, каждое из которых содержит одну HTML-форму (аналогично дизайну на основе мастера).
Тем не менее после того, как пользователь заполняет соответствующие поля в первом представлении и отправляет форму, запускается проверка на стороне клиента для всей модели, и показываются ошибки проверки для полей, которые даже не будут доступны для ввода, пока не будет создан экземпляр второго представления.
В настоящее время я реализовал обходной путь, при котором я просто полностью отключаю проверку на стороне клиента для первого представления, но я, конечно, не заинтересован в идее наполнения моей модели данными, которые вообще не проверялись. Это плохо. M'kay.
Есть ли способ частично проверить поля в первом представлении и не инициировать проверку для всей модели данных?
3 ответа
Вот где приходит ViewModels. Вместо того, чтобы напрямую связывать модель предметной области с представлениями, вы должны создавать над ними модели представлений и связывать их с представлениями.
Если вам не требуется напрямую проверять модели EF, вы можете использовать MetadataType для выполнения частичной проверки по мере необходимости. Взгляните на мой длинный пример здесь на stackru.
Спасибо за вклад всех. Тем не менее, я смог получить решение очень простым способом. Поместив следующий код в элемент HttpPost первого View...
if (ModelState.IsValidField("FirstField") && ModelState.IsValidField("SecondField"))
return RedirectToAction ("NameOfAction", model);
else
return View();
... Мне удалось добиться частичной проверки поля. Однако этот подход к конкретным полям будет работать ТОЛЬКО при условии, что кнопка "Отправить" в первом представлении имеет класс "отмена", а дополнительные ошибки проверки, которые генерируются (для полей, которых нет в первом представлении), вручную очищаются перед тем, как указано выше. если заявление. Для этого используйте:
ModelState["FieldName"].Errors.Clear();
Никаких серьезных изменений в архитектуре. Нет частичных просмотров. Нет передачи неподтвержденных данных.
Работает очень хорошо...
ПРИМЕЧАНИЕ. Если второе представление загружается с ошибками проверки, используйте:
ModelState.Clear();
в действии, где изначально вызывается второй вид. Это сделает второй просмотр View чистым и свободным от ошибок, при этом все еще показывая ошибки проверки позже после окончательной отправки формы.