No exemplo do NerdDinner do Professional ASP.NET MVC 1.0, existe um método para criar um novo jantar como copiado abaixo (página 89 da versão gratuita do NerdDinner).
Lá, verifica ModelState.IsValid como true. Parece verificar se o modelo é válido para o banco de dados (ou seja, ele captura conversões de tipo de dados, como datas com formato inválido, mas não regras de negócios). Isso é verdade?
Ao enviar o formulário, se houver um erro na data, ModelState.IsValid será falso e você receberá um erro novamente, mas somente para a data porque AddRuleViolations nunca foi executado. Se você remover completamente a verificação de ModelState.IsValid, receberá todos os erros (devido à exceção), incluindo uma marcação na data em que ela é inválida. Então, por que a verificação de ModelState.IsValid está presente? Estou esquecendo de algo?
//
// 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);
}
fonte
var errors = ModelState.Values.SelectMany(v => v.Errors);
com um ponto de interrupção para visualizar qualquer problema de validação.Da Errata:
ModelState.AddRuleViolations(dinner.GetRuleViolations());
Deveria estar:
ModelState.AddModelErrors(dinner.GetRuleViolations());
Referência: http://www.wrox.com/WileyCDA/WroxTitle/Professional-ASP-NET-MVC-1-0.productCd-0470384611,descCd-ERRATA.html
fonte
AddModelErrors
método não existe.ModelState.AddModelErrors()
método existeModelState.AddModelError
método não plural existe.Sim, Jared e Kelly Orr estão certos. Eu uso o seguinte código como na exceção de edição.
ao invés de
fonte
Todos os campos de modelo que possuem tipos definidos, devem ser validados quando retornados ao Controller. Se qualquer um dos campos do modelo não corresponder ao tipo definido, o ModelState.IsValid retornará false. Porque, esses erros serão adicionados no ModelState.
fonte