O que é ModelState.IsValid válido no ASP.NET MVC no NerdDinner?


148

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); 
} 

Respostas:


143

ModelState.IsValidinforma se algum erro de modelo foi adicionado a ModelState.

O fichário do modelo padrão adicionará alguns erros para problemas básicos de conversão de tipo (por exemplo, passar um não número para algo que é um "int"). Você pode preencher o ModelState de maneira mais completa com base no sistema de validação que estiver usando.

O DataAnnotationsfichário do modelo de amostra preencherá o estado do modelo com erros de validação extraídos dos DataAnnotationsatributos em seu modelo.


Brad existe alguma maneira de descobrir se um modelo decorado com DataAnnotations "IsValid" sem ModelState. (Digamos, por exemplo, que o objeto seja carregado de um arquivo ou usado em um aplicativo de console etc.) #
runxc1 Bret Ferrier 10/11/11

1
Não, ModelState.IsValid é a única maneira de saber se houve algum erro de validação (ou conversão de dados) durante a ligação do modelo.
Brad Wilson

@ Brad, quando você diz "Você pode preencher o ModelState de maneira mais completa com base no sistema de validação que estiver usando", como isso é feito? Existe uma maneira de abrir meu código de validação do ModelState para meu ViewModel? Como estou usando o EF4, a maior parte da minha validação é automática.
WEFX 16/08/19

13
Use: var errors = ModelState.Values.SelectMany(v => v.Errors);com um ponto de interrupção para visualizar qualquer problema de validação.
full_prog_full

Às vezes, é um erro na tabela relacionada se os nomes das propriedades foram alterados, as migrações não foram executadas e, como resultado, o SaveChanges (); falha e não pode ocorrer devido à alteração.
Oracular Man

25

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


5
A partir de 2015, o AddModelErrorsmétodo não existe.
Felipe Correa

6
A partir de 2016, o ModelState.AddModelErrors()método existe
John

7
A partir de 2017, o ModelState.AddModelErrormétodo não plural existe.
Zachafer 30/03

0

Sim, Jared e Kelly Orr estão certos. Eu uso o seguinte código como na exceção de edição.

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

ao invés de

ModelState.AddRuleViolations(dinner.GetRuleViolations());

0

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.