Atualizar ModelState para remover erros
-
06-07-2019 - |
Pergunta
Atualizando a ModelState
Oi, eu tenho uma pergunta sobre o ModelState em um controlador ASP.NET MVC.
Quando o usuário seleciona uma determinada opção do ponto de vista, a data de início e fim para a "certificação" será definido com base nas outras datas inseridas.
O problema com isto é as datas de certificação voltar como nula e nossa classe CertificationMetaData specifys os campos como [Obrigatório] de modo que o ModelState é inválido, assim que as cargas de ação.
A remoção dos erros ModelSate permite manualmente isso para trabalho, mas eu queria saber se existe uma maneira melhor de fazer isso? Existe uma maneira para atualizar o ModelState? Devo fazer os campos não necessários? Ou devo adicionar um valor de data a partir da visão com javascript?
public ActionResult Create(FormCollection fc, Certification certification, Absence absence)
{
if (certification.CertificationTypeID == 1)
{
certification.CertificationStartDate = absence.StartDate;
certification.CertificationEndDate = absence.StartDate.AddDays(7);
this.ModelState.Remove("CertificationStartDate");
this.ModelState.Remove("CertificationEndDate");
}
if (this.ModelState.IsValid)
{
// save
return RedirectToAction("Index");
}
return View();
}
Além disso, como você pode ver eu ter codificado o valor de ID para o tipo de certificação. Qual é a melhor maneira de comparar os valores com os valores de tabela de pesquisa? É uma enumeração a melhor maneira de ir?
Graças
Solução
Obviamente, isso é uma coisa pessoal, mas eu não iria remover as mensagens de erro.
Se eu estava indo para a solução simples, então eu iria remover o atributo [Obrigatório] e adicionar código de validação para o controlador para adicionar o erro se as datas foram faltando ou configurá-los para o valor alternativo se era o tipo correto.
Se eu estava indo para a solução mais complexa que eu iria colocar a validação no nível do modelo. Possivelmente uma classe base ou e interface que o modelo deve implementar. classe A ValidationHelper com um método estático Validate (objeto IValidate) que irá inspecionar os ValidationAttributes e chama um método Validar o modelo. Seria, então, retornar uma coleção de ValidationErrors. Em seguida, um ModelBinder costume seria escrito que compreende a validação do modelo e mapeia-los para erros ModelState.
Outras dicas
a seguinte abordagem refresca o estado do modelo e permite que você mantenha seu projeto modelo consistente com [necessário] atributos etc.
No meu caso eu quero o meu modelo a ter um campo obrigatório que os usuários nível normal usando uma API não pode mudar, então eu fiz isso:
ModelState.Remove("ChangeDate");
ModelState.Add("ChangeDate", new ModelState());
ModelState.SetModelValue("ChangeDate", new ValueProviderResult(club.ChangeDate, DateTime.Now.ToString(), null));
Dessa forma, você não precisa remover os campos obrigatórios, e você também não precisa fornecer uma data em javascript.