none
Recuperar objeto selecionado em um dropdownlist para associar ao objeto principal RRS feed

  • Pergunta

  • Estou começando com ASP.NET MVC (2) e tenho um cadastro de Pessoa com varios dropdowns, um deles por exemplo de Profissoes. (E já estou passando raiva com esses malditos dropdowns)

    No meu modelo, então, tenho uma classe Pessoa e uma classe Profissao associada à classe Pessoa. Estou trabalhando "Model-First", NÃO TENHO o Id da profissão na classe Pessoa.

    Na minha view , estou usando uma PessoaViewModel, a qual utiliza data anottations para validação de campos obrigatórios (inclusive alguns dropdowns).

    Como é obrigatório selecionar uma profissão, criei em PessoaViewModel uma propriedade int Profissao_Id e na minha view ficou assim:

    <%: Html.DropDownListFor(model => model.Profissao_Id, Model.Profissoes, ""
    )%>
    <%: Html.ValidationMessageFor(model => model.Profissao_Id, "(*)"
    )%>
    
    A validação funciona perfeitamente.

    No entanto, após o meu post, eu tenho apenas o Id  da profissão selecionada no dropdown e não um objeto Profissão. Sendo assim, ao tentar persistir pessoa, ocorre um erro já que a profissão é obrigatória.

    [HttpPost]
    public
     ActionResult Create(PessoaViewModel pessoaViewModel)
    {
      .....     
      if
     (ModelState.IsValid)
      {
       var
     pessoa = Mapper.Map<PessoaViewModel, Pessoa>(pessoaViewModel);
       pessoaBO.Inclui(pessoa);
       return
     RedirectToAction("Index"
    );
      }
      .....
    }
        
    

    Como vocês trabalham em cadastros assim?

    (Estou usando o EF4 para fazer a persistência)

    Obrigado.

    []s


    Robson Castilho - MCTS .Net 2.0 Windows/Web Applications
    MCP Virtual Card: https://www.mcpvirtualbusinesscard.com/VBCServer/robsoncastilho/profile
    [Se o post foi útil, não esqueça de marcá-lo. Obrigado]
    domingo, 12 de setembro de 2010 22:52

Todas as Respostas

  • Bom eu faço assim

     

    pessoa.Profissao = Profissoes.GetById(pessoaViewModel.IDProfissao);

     

    ou seja apartir do id antes de incluir vc busca o objeto pessoa.

     

    nunca testei retornar objeto não.


    1000ton - MSN: milton.filho@msn.com
    terça-feira, 14 de setembro de 2010 13:09
  • Olá

    Foi assim que acabei implementando, mas não é o ideal ficar indo ao banco várias vezes (além de profissão, tenho outras entidades associadas à pessoa). Por isso, busco outras alternativas.

    Qualquer coisa, eu volto a postar por aqui.

    []s

     


    Robson Castilho - MCTS .Net 2.0 Windows/Web Applications
    MCP Virtual Card: https://www.mcpvirtualbusinesscard.com/VBCServer/robsoncastilho/profile
    [Se o post foi útil, não esqueça de marcá-lo. Obrigado]
    quinta-feira, 16 de setembro de 2010 03:47
  • Realmente voce não terá muita opção se quiser guardar todo o objeto.

    Ao carregar um DropDownList no HTML voce estará escrevendo apenas o Text e Value do elemento SELECT(HTML). Em lugar nenhum o objeto é renderizado no cliente.

    Assim após o Post Back somente os Values dos elementos INPUT e SELECT serão enviados via POST. O servidor receberá apenas o código do objeto DropDownList(SELECT), nem mesmo o Text estará disponível como acontece no ASP.Net tradicional.

    Guardar os objetos em Session on tentar recriar uma espécie de ViewState seriam péssimas alternativas.

    No seu caso eu incluiria o ID das referencias nas entidades. Com o ID da profissao na classe Pessoa seria muito mais simples salvar esse objeto. Buscando novamento só a entidade Pessoa e atribuindo os IDs.

    Ainda que nao queira fazer isso terá que 'reatachar' as entidades apos o submit. O ObjectContext que carregou essas entidades tambem nao existe mais apos o postback, isso ja é um pouco mais complicado no EF. Veja o tópico http://www.codeproject.com/KB/architecture/attachobjectgraph.aspx . Tem um exemplo legal. 

    sexta-feira, 17 de setembro de 2010 01:09
  • Obrigado pela resposta

    Colocar os IDs das foreign keys era o que eu não queria fazer, já que gostaria de trabalhar em um modelo totalmente OO, simplesmente ignorando o banco de dados.

    Mas, pelo jeito, tudo está indo para este caminho.... é OO mas não é :(

    []s e valeu.

     

     


    Robson Castilho - MCTS .Net 2.0 Windows/Web Applications
    MCP Virtual Card: https://www.mcpvirtualbusinesscard.com/VBCServer/robsoncastilho/profile
    [Se o post foi útil, não esqueça de marcá-lo. Obrigado]
    sexta-feira, 17 de setembro de 2010 02:04