Что такое ModelState.IsValid, допустимое для ASP.NET MVC в NerdDinner?

На пример NerdDinner Профессиональный ASP.NET MVC 1.0 есть способ создать новый обед как скопированный ниже (страница 89 бесплатной версии NerdDinner).

Там он проверяет ModelState.IsValid для true. Кажется, проверяет, действительна ли модель для базы данных (то есть, она перехватывает преобразования типа данных, например, даты с недопустимым форматом, но не бизнес-правила). Это правда?

При отправке формы, если у вас есть ошибка в дате, ModelState.IsValid будет ложным, и вы вернете ошибку, но только для даты, потому что 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); 
} 

Ответ 1

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

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

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