Что такое ModelState.IsValid для ASP.NET MVC в NerdDinner? - PullRequest
134 голосов
/ 19 мая 2009

На 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 ]

134 голосов
/ 19 мая 2009

ModelState.IsValid сообщает, были ли какие-либо ошибки модели добавлены в ModelState.

Связыватель модели по умолчанию добавит некоторые ошибки для основных проблем преобразования типов (например, передача не-числа для чего-то, что является "int"). Вы можете заполнить ModelState более полно в зависимости от используемой вами системы валидации.

Образец подшивки DataAnnotations модели заполнит состояние модели ошибками проверки, взятыми из атрибутов DataAnnotations вашей модели.

25 голосов
/ 14 июля 2009

Из опечаток: ModelState.AddRuleViolations(dinner.GetRuleViolations());

Должно быть:

ModelState.AddModelErrors(dinner.GetRuleViolations());

Ссылка: http://www.wrox.com/WileyCDA/WroxTitle/Professional-ASP-NET-MVC-1-0.productCd-0470384611,descCd-ERRATA.html

0 голосов
/ 11 марта 2018

Да, Джаред и Келли Орр правы. Я использую следующий код, как при редактировании исключения.

foreach (var issue in dinner.GetRuleViolations())
{
    ModelState.AddModelError(issue.PropertyName, issue.ErrorMessage);
}

вместо

ModelState.AddRuleViolations(dinner.GetRuleViolations());
...