Popular DropDownList and insert with the chosen value

1

In my DB I have 3 tables:

- Genero(IdGenero,Genero,Descricao)
- Publicação(IdPublicacao, Titulo, Sinopse,IdUsuario) 
- PublicaçãoGenero(IdPublicacaoGenero,IdPublicacao,IdGenero)

This last one links the first two.

My first question is: How popular is DropDownList with the values in the Genero table (Are the genres already stored in the database)? I got to do it this way:

In the Create Publication Action I put the following line

ViewBag.Genero = new SelectList(db.Genero, "IdGenero", "Genero1", pg.IdPublicacao);

And in the view I did so:

@Html.DropDownList("Genero", ViewBag.Genero as SelectList, "Selecione um Genero")

However, I get the following error:

  

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

My second question:

How to get the id of what gender the user chose, so that he can insert it in the third table ( PublicacaoGenero )?

Edit:

This is my controller responsible for creating the publication.

 [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult CriarPub(Publicacao pub)
        {
            PublicacaoGenero pg = new PublicacaoGenero();
            if (ModelState.IsValid)
            {
               ViewBag.Generos= db.Genero.ToList();
               pub.DtCriacao = DateTime.Now;
               db.Publicacao.Add(pub);
               pg.IdPublicacao = pub.IdPublicacao;
               pg.IdGenero = //aqui entraria o id do genero selecionado na dropdownlist
               db.SaveChanges();
               return RedirectToAction("Index", "Usuario");
            }
            return View(pub);
        }

I do not know if I do it right, but that's how I usually do it.

    
asked by anonymous 13.10.2014 / 01:53

1 answer

1

Try to do it the old way. It's a little more verbose, but it always works:

ViewBag.Generos = db.Genero.ToList();

View

@Html.DropDownListFor(model => model.GeneroId, ((IEnumerable<Genero>)ViewBag.Generos).Select(option => new SelectListItem {
    Text = option.Nome, 
    Value = option.Id.ToString(), 
    Selected = (Model != null) && (Model.GeneroId == option.Id)
}), "Selecione um Genero")

Controller, method POST

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult CriarPub(Publicacao pub)
    {
        if (ModelState.IsValid)
        {
           pub.DtCriacao = DateTime.Now;
           db.Publicacao.Add(pub);

           var pg = new PublicacaoGenero();

           // Esqueça essa construção. Esse tipo de atribuição pode provocar 
           // uma inclusão do registro em duplicidade.
           // pg.IdPublicacao = pub.IdPublicacao;
           // pg.IdGenero = //aqui entraria o id do genero selecionado na dropdownlist

           // Primeiro carregue o Genero no seu contexto e depois atribua o objeto
           // (não o Id) diretamente no objeto que está sendo criado.
           pg.Genero = db.Genero.SingleOrDefault(g => g.Id == pub.GeneroId);
           pg.Publicacao = pub;
           db.SaveChanges();
           return RedirectToAction("Index", "Usuario");
        }

        // A ViewBag é preenchida fora porque serve para o MVC refazer a View
        // caso ela seja inválida.
        ViewBag.Generos= db.Genero.ToList();
        return View(pub);
    }
    
13.10.2014 / 02:06