How to use Validationmessagefor in Dropdownlistfor?

Asked

Viewed 326 times

0

Please, can someone tell me how to use the @Html.Validationmessagefor for a @Html.Dropdownlistfor? Assuming the user has triggered the option to write from the system screen he should inform that the field is required; instead, the system is showing an error:

Value cannot be null. Name of parameter: source

It seems that when performing the post the Viewbag is null and so instead of calling the Vilidationmessagefor it informs the above error!

Thanks for all 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 (Negocio)

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 (Data Load 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();
}
  • You just want to put the message of required when submitting the form or message returned from the server (the one that is usually red)?

  • How is the Action of Controller receiving the data to be validated?

  • Randrade and Gypsy Morrison Mendez thank you very much for answering, I updated the question, I also identified that it seems that the Viewbag that I am using to load the Dropdownlist is null when the record button that performs post in the form is triggered. Thanks again!

1 answer

0


Some things are still missing. This error you had means that the form information did not go through validation, the View return filled with errors and all Dropdowns need to be loaded again. As they were not loaded again, @Html.DropDownListFor complains of a source null.

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

[HttpPost]
public ActionResult GravarPessoaFisica(PessoaFisicaModel pessoafisica)
{
    PessoaFisicaClass _pessoaFisica = new PessoaFisicaClass();
    try // Controllers não devem tratar exceções.
    // Veja /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();
    }
}

Browser other questions tagged

You are not signed in. Login or sign up in order to post.