Что такое ModelState.IsValid для ASP.NET MVC в NerdDinner?
На примере NerdDinner Professional ASP.NET MVC 1.0 есть метод для создания нового обеда в виде скопированного ниже (стр. 89 бесплатной версии NerdDinner).
Там он проверяет ModelState.IsValid на true. Кажется, он проверяет, является ли модель действительной для базы данных (то есть она улавливает преобразования типов данных, например даты с недопустимым форматом, но не бизнес-правила). Это правда?
При отправке формы, если у вас есть ошибка в дате, ModelState.IsValid будет иметь значение false, и вы получите ошибку, но только для даты, потому что AddRuleViolations никогда не выполнялся. Если вы полностью удалите проверку ModelState.IsValid, вы получите все ошибки (из-за исключения), включая отметку в дате, когда она недействительна. Тогда зачем вообще проверять ModelState.IsValid? Я что-то пропустил?
//
// POST: /Dinners/Create
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(Dinner dinner) {
if (ModelState.IsValid) {
try {
dinner.HostedBy = "SomeUser";
dinnerRepository.Add(dinner);
dinnerRepository.Save();
return RedirectToAction("Details", new {id = dinner.DinnerID });
} catch {
ModelState.AddRuleViolations(dinner.GetRuleViolations());
}
}
return View(dinner);
}
3 ответа
ModelState.IsValid
сообщает, были ли добавлены какие-либо ошибки модели ModelState
,
Связыватель модели по умолчанию добавит некоторые ошибки для основных проблем преобразования типов (например, передача не-числа для чего-то, что является "int"). Вы можете заполнить ModelState более полно в зависимости от используемой вами системы валидации.
Пример DataAnnotations
связыватель модели заполнит состояние модели ошибками проверки, взятыми из DataAnnotations
атрибуты на вашей модели.
Из опечаток:ModelState.AddRuleViolations(dinner.GetRuleViolations());
Должно быть:
ModelState.AddModelErrors(dinner.GetRuleViolations());
Все поля модели, которые имеют определенные типы, должны быть проверены при возврате в контроллер. Если какое-либо из полей модели не соответствует их определенному типу, ModelState.IsValid вернет false. Потому что эти ошибки будут добавлены в ModelState.
Да, Джаред и Келли Орр правы. Я использую следующий код, как в редактировании исключения.
foreach (var issue in dinner.GetRuleViolations())
{
ModelState.AddModelError(issue.PropertyName, issue.ErrorMessage);
}
вместо
ModelState.AddRuleViolations(dinner.GetRuleViolations());