How to use ValidationMessageFor in DropDownListFor?

0

Please can someone tell me how to use the @Html.ValidationMessageFor for a @Html.DropDownListFor? Assuming that the user has triggered the option to save from the system screen he should inform that the field is mandatory; instead, the system is experiencing an error:

  

Value can not be null. Parameter name: source

It seems that when doing the post ViewBag is null and so instead of calling the VilidationMessageFor it informs the above error!

Thanks in advance for your help!

View

@Html.ValidationSummary(true)

<label for="lblTratamento">Tratamemto <i style = "color:red;">*</i></label>
@Html.DropDownListFor(model => model.Tratamento,
     ((IEnumerable<TratamentoModel>)ViewBag.Tratamento).Select(tratamento => new SelectListItem
       {
           Text = tratamento.DescricaoTratamento,
           Value = tratamento.DescricaoTratamento,
           Selected = (Model != null) && (Model.Tratamento == tratamento.DescricaoTratamento)
       }), "Escolha um Tratamento", new { @class = "form-control select2 left cmb-treatment", @id = "ddlTratamento" })

@Html.ValidationMessageFor(model => model.Tratamento, String.Empty, new { @style = "color:red;!important" })

Model

public class PessoaFisicaModel
{
    [Required(ErrorMessage = "Selecione um tratamento.", AllowEmptyStrings = false)]
    public string Tratamento { get; set; }
}

Class

public class TratamentoClass
    {
        public List<T> ObtemListaTratamento<T>() where T : ITratamento, new()
        {
            ModelagemDados db = new ModelagemDados();

            try
            {
                var listaTratamento = db.Tratamento.Select(
                x => new T()
                {
                    CodigoTratamento = x.CodigoTratamento,
                    DescricaoTratamento = x.DescricaoTratamento
                }).ToList();

                return listaTratamento;
            }
            catch (DbEntityValidationException dbEx)
            {
                foreach (var validationErrors in dbEx.EntityValidationErrors)
                {
                    foreach (var validationError in validationErrors.ValidationErrors)
                    {
                        Trace.TraceInformation("Property: {0} Error: {1}",
                                                validationError.PropertyName,
                                                validationError.ErrorMessage);
                    }
                }
                throw;
            }

        }

Controller

[HttpPost]
public ActionResult GravarPessoaFisica(PessoaFisicaModel pessoafisica)
{
    PessoaFisicaClass _pessoaFisica = new PessoaFisicaClass();
    try
    {
          if (ModelState.IsValid)
          {
             var retorno = _pessoaFisica.GravarPessoaFisica(pessoafisica);
             if (retorno != 0)
             {
                 return RedirectToAction("Index", "CadastroCliente");
             }
                ViewBag.Message = "Erro: Por favor, reporte o ocorrido ao administrador do sistema";
           }
              return View("CadastrarCliente", pessoafisica);
            }
    catch (DbEntityValidationException dbEx)
    {
        foreach (var validationErrors in dbEx.EntityValidationErrors)
        {
             foreach (var validationError in validationErrors.ValidationErrors)
             {
                 Trace.TraceInformation("Property: {0} Error: {1}",
                                         validationError.PropertyName,
                                         validationError.ErrorMessage);
        }
             }
     return ViewBag.Message == "Contate o administrador do sistema, Erro: " + dbEx.Message.ToString();
            }
}

Controller

public ActionResult CadastrarCliente(string user)
{
     var retornoEstado = new EstadoClass().ObtemLista<EstadoModel>();
     var retornoCidadeIbge = new CidadeIbgeClass().ObtemLista<CidadeIbgeModel>();
     var retornoBanco = new BancoClass().ObtemLista<BancoModel>();
     var retornoSitucao = new SituacaoClass().ObtemLista<SituacaoModel>();
     var retornoOrgao = new OrgaoClass().ObtemListaOrgao<OrgaoModel>();
     var retornoLotacao = new LotacaoClass().ObtemListaLotacao<LotacaoModel>();
     var retornoTratamento = new TratamentoClass().ObtemListaTratamento<TratamentoModel>();
     var retornoEstadoCivil = new EstadoCivilClass().ObtemLista<EstadoCivilModel>();
     var retornoTipoTelefone = new TipoTelefoneClass().ObtemLista<TipoTelefoneModel>();
     var retornoCargo = new CargoClass().ObtemLista<CargoModel>();
     ViewBag.Estado = retornoEstado;
     ViewBag.CidadeIbge = retornoCidadeIbge;
     ViewBag.Banco = retornoBanco;
     ViewBag.Situacao = retornoSitucao;
     ViewBag.Orgao = retornoOrgao;
     ViewBag.Lotacao = retornoLotacao;
     ViewBag.Tratamento = retornoTratamento;
     ViewBag.EstadoCivil = retornoEstadoCivil;
     ViewBag.TipoTelefone = retornoTipoTelefone;
     ViewBag.Cargo = retornoCargo;
     return View();
}
    
asked by anonymous 25.04.2017 / 22:58

1 answer

0

There are still a few things missing. This error you had means that the form information has not been validated, the View will return filled with errors and all DropDowns need to be loaded again. Since they were not reloaded, @Html.DropDownListFor complains of a source null.

In short, the change is in Controller . My comments are by code. I ask you to read all:

[HttpPost]
public ActionResult GravarPessoaFisica(PessoaFisicaModel pessoafisica)
{
    PessoaFisicaClass _pessoaFisica = new PessoaFisicaClass();
    try // Controllers não devem tratar exceções.
    // Veja https://pt.stackoverflow.com/questions/21278/como-interceptar-exce%C3%A7%C3%B5es-quando-se-trabalha-com-o-entity-framework/21343#21343
    {
        if (ModelState.IsValid)
        {
            var retorno = _pessoaFisica.GravarPessoaFisica(pessoafisica);
            if (retorno != 0)
            {
                return RedirectToAction("Index", "CadastroCliente");
            }

            // Que ocorrido? 
            // O usuário não tem que reportar coisa alguma.
            // Você que tem que interceptar a exceção internamente usando 
            // uma ferramenta e apenas devolver mensagem de erro que a 
            // operação falhou.
            ViewBag.Message = "Erro: Por favor, reporte o ocorrido ao administrador do sistema";
        }

        // Repita aqui a carga da Action GET     
        ViewBag.Estado = new EstadoClass().ObtemLista<EstadoModel>();
        ViewBag.CidadeIbge = new CidadeIbgeClass().ObtemLista<CidadeIbgeModel>();
        ViewBag.Banco = new BancoClass().ObtemLista<BancoModel>();
        ViewBag.Situacao = new SituacaoClass().ObtemLista<SituacaoModel>();
        ViewBag.Orgao = new OrgaoClass().ObtemListaOrgao<OrgaoModel>();
        ViewBag.Lotacao = new LotacaoClass().ObtemListaLotacao<LotacaoModel>();
        ViewBag.Tratamento = new TratamentoClass().ObtemListaTratamento<TratamentoModel>();
        ViewBag.EstadoCivil = new EstadoCivilClass().ObtemLista<EstadoCivilModel>();
        ViewBag.TipoTelefone = new TipoTelefoneClass().ObtemLista<TipoTelefoneModel>();
        ViewBag.Cargo = new CargoClass().ObtemLista<CargoModel>();

        return View("CadastrarCliente", pessoafisica);
    }
    // Este catch deve ser movido para SaveChanges() e SaveChangesAsync() do contexto.
    catch (DbEntityValidationException dbEx)
    {
        foreach (var validationErrors in dbEx.EntityValidationErrors)
        {
            foreach (var validationError in validationErrors.ValidationErrors)
            {
                Trace.TraceInformation("Property: {0} Error: {1}",
                                         validationError.PropertyName,
                                         validationError.ErrorMessage);
            }
        }

        return ViewBag.Message == "Contate o administrador do sistema, Erro: " + dbEx.Message.ToString();
    }
}
    
26.04.2017 / 17:31