Что ModelState.IsValid действителен для in ASP.NET MVC в NerdDinner?



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



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



при отправке формы, если у вас ошибка в дате, ModelState.IsValid будет false, и вы получите сообщение об ошибке, но только для даты, потому что AddRuleViolations никогда не выполнялся. Если вы удалите проверку для ModelState.IsValid полностью, тогда вы получите все ошибки (из-за исключения), включая маркировку в дате, когда она недействительна. Тогда, почему это проверка для ModelState.Есть ли там вообще валид? Я что-то упустил?



// 
// 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);
}
493   3  

3 ответов:

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

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

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

из опечаток: 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

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

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

вместо

ModelState.AddRuleViolations(dinner.GetRuleViolations());

Comments

    Ничего не найдено.