There is no ViewData item of type 'IEnumerable' that has the key

1

I'm having a problem with the Employee Position that stays in a separate Table, when I try to create an employee selecting the position, it's the error ... but if I assign the position in the Controller (Ex: official.CargoID = 1) it works normal ... I also tried to pass the job 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.

Job 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; }
}

How is a Person's Inheritance, the people class:

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 save it from this error:

  

There is no ViewData item of type 'IEnumerable' that   has the key 'CargoID'.

    
asked by anonymous 15.11.2016 / 23:53

1 answer

2

You are not loading your view bag in @ Html.DropDownList

It should be like this to load viewbag items.

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

Or even better

 @Html.DropDownListFor(m=>m.CargoID, (SelectList)ViewBag.CargoId)
    
16.11.2016 / 12:46