Recuperando a Coleta de Erros de Estado do Modelo em ASP.NET MVC
Resposta Rápida
Aplicando a seguinte consulta LINQ a ModelState
, você pode obter uma lista de mensagens de erro de estado do modelo em ASP.NET MVC:
var listaDeErros = ModelState.Values.SelectMany(v => v.Errors).Select(e => e.ErrorMessage).ToList();
Isso criará uma coleção List<string>
contendo todas as mensagens de erro, que podem ser usadas para exibição ou registro.
Gerenciamento de Erros em Profundidade
Verificando o ModelState
ModelState
em uma aplicação ASP.NET MVC coleta erros de validação que ocorrem durante a vinculação do modelo. Verificar ModelState.IsValid
ajuda a garantir que não estamos lidando com dados incorretos:
if (!ModelState.IsValid)
{
// Não se pode extrair ouro do lixo!
}
Identificando Erros Específicos
Use o seguinte código para verificar a presença de erros antes de executar uma ação:
bool temErros = ViewData.ModelState.Values.Any(x => x.Errors.Count >= 1);
Para uma análise detalhada de erros relacionados a propriedades específicas, verifique cuidadosamente o ModelState
:
foreach (var estadoValor in ViewData.ModelState)
{
foreach (var erro in estadoValor.Value.Errors)
{
// Aqui você encontrará os detalhes dos erros!
}
}
Gerando Mensagens de Erro
Se precisar criar uma única string com mensagens de erro para exibição:
var mensagemErroUnica = string.Join("; ", ModelState.Values
.SelectMany(e => e.Errors)
.Select(e => e.ErrorMessage));
Usando LINQ para Ordenar Erros
O método LINQ SelectMany
será útil para processar coleções aninhadas, enquanto as chaves em ModelState.Keys
permitirão iterar pelas propriedades do modelo:
var errosDoModelState = ModelState
.Where(kvp => kvp.Value.Errors.Count > 0)
.ToDictionary(kvp => kvp.Key, kvp => kvp.Value.Errors
.Select(e => e.ErrorMessage)
.ToArray());
// Na complexidade, você não pode esconder um erro
Melhorando a Visibilidade de Erros e Elementos de Formulário
Para melhorar a experiência do usuário, destaque controles que contenham erros:
@Html.TextBoxFor(m => m.Nome, new { @class = ViewData.ModelState["Nome"].Errors.Any() ? "input-validation-error" : "" })
@Html.ValidationMessageFor(m => m.Nome)
// O jogo começou, encontre o erro!
Visualização
Erros de estado do modelo em ASP.NET MVC podem ser visualizados como uma rede que captura pequenos erros-peixes em um vasto oceano de dados:
🌊 Oceano de dados
🌐🐠🐟🐡 Rede de erros do modelo
Use uma lupa para examinar a captura:
🔍 | Erros
---|----------------
1 | 🐟 O campo 'Nome' é obrigatório.
2 | 🐠 O campo 'Email' não está em um formato de email válido.
3 | 🐡 O campo 'Idade' deve ser um número positivo.
Cada "célula" da rede simboliza um ponto onde um erro foi capturado e agora aguarda processamento.
Navegando pelo Mar de Erros
Uma vez que os erros são capturados:
- Oriente os usuários através do
ModelState
, destacando erros logo ao lado dos campos do formulário. - Torne os erros mais visíveis através de estilização CSS condicional.
- Forneça feedback em tempo hábil usando anotações de dados nos modelos.
Acessibilidade no Tratamento de Erros
Garanta que o tratamento de erros seja acessível a todos os usuários:
- Use o atributo
aria-invalid="true"
em campos com erros para melhorar a acessibilidade. - Empregue regiões
aria-live
para feedback em tempo real para usuários de leitores de tela.
Melhores Práticas para Trabalhar com Erros do ModelState
Tenha em mente estas melhores práticas:
- Registre erros do ModelState para auditoria e depuração.
- Nas mensagens de erro, evite jargões; priorize clareza e especificidade.
- Apresente erros de forma que evite sobrecarga de informações; use tooltips ou mensagens inline para facilitar a leitura.
Recursos Úteis
- Adicionando Validação | Microsoft Learn — guia oficial para implementar validação em aplicações ASP.NET MVC.
- ModelState em ASP.NET MVC — uma exploração detalhada de como gerenciar ModelState e erros.
- Resolvendo métodos de ação ambíguos em ASP.NET MVC e Ajax — um guia útil para trabalhar com erros do ModelState e Ajax.
- Postbacks em ASP.NET MVC e ModelState — a importância de diagnosticar e registrar erros do ModelState.