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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top