There is no Viewdata item of type 'Ienumerable' that has the key

Asked

Viewed 1,159 times

3

I’m having trouble with the Employee Position that is on a separate Table, when I try to create an employee selecting the position, he error... but if I assign the position in Controller (Ex: funcio.Cargoid = 1) ele funciona normal... I also tried to pass the post by parameter by adding the following:

    public ActionResult Create([Bind(Include = "PessoaID,Nome,Telefone,Celular,Whatsapp,Email,CPF,RG,CTPS,DataNascimento,DataAdmissao,DataDemissao,Senha,CargoID")] Funcionario funcionario, string salario, string cargo)
    {
    funcionario.CargoID = Convert.ToInt32(Cargo);
   .
   .
   .
   ViewBag.CargoID = new SelectList(db.Cargos, "CargoID", "Descricao", funcionario.CargoID);
   return View(funcionario);
   }

but it comes with null value.

office class:

public class Cargo
{
    [Key]
    public int CargoID { get; set; }

    public string Descricao { get; set; }

    public virtual ICollection<Funcionario> Funcionarios { get; set; }
}

Employee Class:

public class Funcionario : Pessoa
{
    [Required(ErrorMessage = "Preencha o RG")]
    [DisplayName("RG")]
    public string RG { get; set; }

    [Required(ErrorMessage = "Preencha o numero da CTPS")]
    [DisplayName("CTPS")]
    public string CTPS { get; set; }

    [Required(ErrorMessage = "Preencha data de nascimento")]
    [DisplayName("Data de Nascimento")]
    [DataType(DataType.Date, ErrorMessage = "Formato Incorreto")]
    public DateTime DataNascimento { get; set; }

    [Required(ErrorMessage = "Preencha a data de admissão")]
    [DisplayName("Data de Admissão")]
    [DataType(DataType.Date, ErrorMessage = "Formato Incorreto")]
    public DateTime DataAdmissao { get; set; }

    [DisplayName("Data de Demissão")]
    [DataType(DataType.Date, ErrorMessage = "Formato Incorreto")]
    public DateTime DataDemissao { get; set; }

    [Required(ErrorMessage = "Preencha o Salário")]
    [DisplayName("Salário")]
    public decimal Salario { get; set; }

    [StringLength(25, MinimumLength = 5, ErrorMessage = "A senha deve ter no mínimo 5 e no máximo 25 caracteres.")]
    [Required(ErrorMessage = "Preencha a senha")]
    [DisplayName("Senha")]
    [DataType(DataType.Password)]
    public string Senha { get; set; }

    //Relacionamentos
    public int CargoID { get; set; }
    public virtual Cargo Cargo { get; set; }
}

As it is an Inheritance of Person, Class People:

public class Pessoa
{
    [Key]
    public int PessoaID { get; set; }

    [Required(ErrorMessage = "Preencha o nome")]
    [DisplayName("Nome")]
    [StringLength(150, MinimumLength = 2, ErrorMessage = "O nome deve ter no mínimo 2 e no máximo 150 caracteres.")]
    public string Nome { get; set; }

    [DisplayName("Telefone")]
    public string Telefone { get; set; }

    [DisplayName("Celular")]
    public string Celular { get; set; }

    [DisplayName("Email")]
    [StringLength(150, ErrorMessage = "O E-mail deve ter no máximo 150 caracteres.")]
    public string Email { get; set; }

    [Required(ErrorMessage = "Preencha o CPF")]
    [DisplayName("CPF")]
    [StringLength(14, MinimumLength = 14, ErrorMessage = "O CPF deve 14 caracteres.")]
    public string CPF { get; set; }

    public int Tipo { get; set; }

 }

and My controller:

    public ActionResult Create()
    {
        ViewBag.CargoID = new SelectList(db.Cargos, "CargoID", "Descricao");
        return View();
    }
    // POST: Funcionario/Create
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create([Bind(Include = "PessoaID,Nome,Telefone,Celular,Whatsapp,Email,CPF,RG,CTPS,DataNascimento,DataAdmissao,DataDemissao,Senha,CargoID")] Funcionario funcionario, string salario)
    {
        if (funcionario.Email == "")
        {
            ViewBag.Error = "Informe o e-mail do funcionario";
            return View();
        }
        if (funcionario.DataNascimento > DateTime.Now || funcionario.DataNascimento < DateTime.Now.AddYears(-100))
        {
            ViewBag.Error = "Verifique a data de nascimento";
            return View();
        }
        if (funcionario.DataAdmissao > DateTime.Now || funcionario.DataAdmissao < DateTime.Now.AddYears(-50))
        {
            ViewBag.Error = "Verifique a data de admissão";
            return View();
        }
        if (salario != "")
        {
            salario = Regex.Replace(salario, "[^0-9,]", "");
            funcionario.Salario = Convert.ToDecimal(salario);
        }
        else
        {
            ViewBag.Error = "O salário não pode ficar Vazio";
            return View();
        }
        funcionario.Tipo = 1;
        if (ModelState.IsValid)
        {
            db.Pessoas.Add(funcionario);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        ViewBag.CargoID = new SelectList(db.Cargos, "CargoID", "Descricao", funcionario.CargoID);
        return View(funcionario);
    }

when I click to save him from this mistake:

There is no Viewdata item of type 'Ienumerable' that has the key 'Cargoid'.

inserir a descrição da imagem aqui

  • Ta so: funcionario.CargoID = Convert.ToInt32(Cargo); wouldn’t be like this: funcionario.CargoID = Convert.ToInt32(CargoID);, because the <select> created is CargoID

1 answer

4


You are not loading your view bag into @Html.Dropdownlist

It should be so to load viewbag items.

 @Html.DropDownList("CargoID", (SelectList)ViewBag.CargoId)

Or better yet

 @Html.DropDownListFor(m=>m.CargoID, (SelectList)ViewBag.CargoId)

Browser other questions tagged

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