none
Valor de DropDownList RRS feed

  • Pergunta

  • Boa noite.

    Tenho as seguintes classes:

        public class Marca
        {
            public int Id { get; set; }
            public string Nome { get; set; }
        }
    
        public class Produto
        {
            public int Id { get; set; }
            public string Nome { get; set; }
            public Marca Marca { get; set; }
        }

    A propriedade 'Marca' da classe Produto está sendo renderizada como um DropDown ..

    Minha dúvida é como montar um obj Produto para gravação tendo a propriedade Marca preenchida.

    Por enquanto estou renderizando todas as marcas em um DropDown com name="IdMarca":

    @Html.DropDownList("IdMarca",(SelectList)ViewBag.Marcas)

    e na action pegando o valor assim:

            [HttpPost]
            public ActionResult Create(Produto produto,FormCollection form)
            {
                if (ModelState.IsValid)
                {
                    produto.Marca = db.Marca.Find(int.Parse(form["IdMarca"]));
                    db.Produto.Add(produto);
                    db.SaveChanges();
    
                    return RedirectToAction("Index");
                }
    
                return View(produto);
            }


    http://www.linkedin.com/pub/murilo-kunze/44/191/455

    quinta-feira, 5 de abril de 2012 00:52

Todas as Respostas

  • Sobre já carregar a Marca no produto troque "IdMarca" por "Marca.Id", com isso não é necessário o parâmetro FormCollection

    Ele já cria o objeto Marca com Id.

    @Html.DropDownList("Marca.Id",(SelectList) ViewBag.Marcas)

    Sobre  

    produto.Marca = db.Marca.Find(int.Parse(form["IdMarca"]));

    Acho que o EF assim como o NH reconhece o objeto (Marca) com apenas o Id preenchido.



    Não esqueça de marcar o post como útil caso tenha te ajudado.


    • Editado Marco Souza quinta-feira, 5 de abril de 2012 03:30
    quinta-feira, 5 de abril de 2012 03:28
  • Blz Marco, fiz isso.. mas debugando na action Create percebi que o parâmetro produto.Marca aparece assim (id=1 e nome=null).. 

    Fiz assim:

                if (ModelState.IsValid)
                {
                    produto.Marca = db.Marcas.Find(produto.Marca.Id);
                    db.Produtoes.Add(produto);
                    db.SaveChanges();
                    return RedirectToAction("Index");  
                }

    e assim:

                if (ModelState.IsValid)
                {
                    db.Produtoes.Add(produto);
                    db.SaveChanges();
                    return RedirectToAction("Index");  
                }
    das duas maneiras a marca não está sendo salva junto com o produto.. a marca sempre vem null.


    http://www.linkedin.com/pub/murilo-kunze/44/191/455

    quinta-feira, 5 de abril de 2012 14:27
  • Descobri o problema de cima.. estava faltando o Include("Marca")..

    Agora estou fazendo assim:

    @Html.DropDownListFor(model => model.Marca.Id,(SelectList)ViewBag.Marcas)

    e na action Create:

            [HttpPost]
            public ActionResult Create(Produto produto)
            {
                if (ModelState.IsValid)
                {
                    produto.Marca = db.Marcas.Find(produto.Marca.Id);
                    db.Produtoes.Add(produto);
                    db.SaveChanges();
                    return RedirectToAction("Index");  
                }
    
                return View(produto);
            }

    Se eu não fizer o db.Marcas.Find() então não funciona.. é assim mesmo??


    http://www.linkedin.com/pub/murilo-kunze/44/191/455

    quinta-feira, 5 de abril de 2012 14:45