none
Enviar dados (n:n) da view para o controller e persistir usando entity, como fazer? RRS feed

  • Pergunta

  • Olá pessoal,

    alguém poderia me dar uma luz? Tenho uma view de cadastro, onde é cadastrado uma vaga de emprego. Uma vaga possui uma ou mais competências exigidas. Nessa tela eu carrego todas as competências, essas competências foram cadastradas previamente e estão em uma tabela chamada (competencia), faço esse carregamento usando ajax. Para cadastrar uma vaga o usuário informa as informações referente a vaga, essa informações serão inseridas em uma tabela chamada (VagaEmprego), e seleciona as competência exigidas para a vaga, as competências deverão ser inseridas em uma tabela de relacionamento chamada (VagaEmpregoCompetencia). Como eu passo essas informações para o controller e persisto usando entity? 

    Obs: Eu consegui fazer inserindo somente as informações na tabela VagaEmprego, não estou conseguindo fazer a persistência em ambas tabelas, também não sei como passar todas as informações para o controller, para passar as informações da VagaEmprego eu estou usando json, mas, e para mandar as competências junto? 

    Desde já agradeço.



    • Editado dani.ela terça-feira, 12 de agosto de 2014 14:46
    terça-feira, 12 de agosto de 2014 14:43

Respostas

  • Olá,

    Para casos onde você tem informações de diversas tabelas, é interessante criar um ViewModel (Uma classe) que contém todos os campos que você precisa, como por exemplo:

    List<Competencia>
    Dados da vaga (Titulo, Id, Desc)

    Sendo assim, sua View vai refletir sua ViewModel, e no POST da sua View, você pode recuperar essa ViewModel, e trabalhar em cima dela, separando o que é competência, o que é vaga e a junção das duas para a tabela associativa.

    Veja se este exemplo te ajuda:
    http://eduardopires.net.br/2013/08/asp-net-mvc-view-model-pattern-quando-e-como-utilizar/

    Ajudou?


    Se sua questão foi respondida, favor marcar.

    André Baltieri
    MTAC – Microsoft Technical Audience Contributor

    Twitter: @andrebaltieri
    Blog: http://andrebaltieri.net
    Site: http://sismat.com.br

    • Sugerido como Resposta Fernando Mamprin terça-feira, 12 de agosto de 2014 17:30
    • Marcado como Resposta dani.ela terça-feira, 12 de agosto de 2014 21:14
    terça-feira, 12 de agosto de 2014 14:52
  • Olá novamente,

    um comentário que pode ser útil para quem esteja com o mesmo problema. A sugestão do André me fez analisar e chegar a conclusão que meu real problema era não estar conseguindo enviar a lista decompetências para o controller. No meu caso não foi necessário criar a ViewModel, pois, como é um relacionamento n:n ambas classes (competenciacandidato) possuem uma lista para que entity crie a tabela de relacionamento. Bom, então a primeira parte do meu problema foi resolvida na montagem do html na view. Cada competência é carregada em um checkbox. Para que o controller faça o bind dos checkbox's na propriedade listCompetencia da classe os checkbox devem ser declarados de uma forma que o controller seja capaz de entender isso, ficou assim:

    <input type='checkbox' name="@("listCompetencia[" + i + "].Id" value="@Model.listCompetencia[i].Id" />

    O '@(' no inicio da propriedade name é usado para fazer concatenação no razor, esse input esta sendo criado dentro de um for e eu estou usando o mesmo índice para o for e para os check's, por isso a concatenação no name. Bom, agora que já tenho as informações no controller, bora persistir em ambas tabelas.

    Vlw mesmo pela dica!


    • Editado dani.ela terça-feira, 12 de agosto de 2014 21:14
    • Marcado como Resposta dani.ela terça-feira, 12 de agosto de 2014 21:40
    terça-feira, 12 de agosto de 2014 21:13

Todas as Respostas

  • Olá,

    Para casos onde você tem informações de diversas tabelas, é interessante criar um ViewModel (Uma classe) que contém todos os campos que você precisa, como por exemplo:

    List<Competencia>
    Dados da vaga (Titulo, Id, Desc)

    Sendo assim, sua View vai refletir sua ViewModel, e no POST da sua View, você pode recuperar essa ViewModel, e trabalhar em cima dela, separando o que é competência, o que é vaga e a junção das duas para a tabela associativa.

    Veja se este exemplo te ajuda:
    http://eduardopires.net.br/2013/08/asp-net-mvc-view-model-pattern-quando-e-como-utilizar/

    Ajudou?


    Se sua questão foi respondida, favor marcar.

    André Baltieri
    MTAC – Microsoft Technical Audience Contributor

    Twitter: @andrebaltieri
    Blog: http://andrebaltieri.net
    Site: http://sismat.com.br

    • Sugerido como Resposta Fernando Mamprin terça-feira, 12 de agosto de 2014 17:30
    • Marcado como Resposta dani.ela terça-feira, 12 de agosto de 2014 21:14
    terça-feira, 12 de agosto de 2014 14:52
  • Fala andré, blz?

    Estou tentando implementar dessa forma, qualquer novidade volto aqui.

    vlw!!

    terça-feira, 12 de agosto de 2014 18:09
  • Olá novamente,

    um comentário que pode ser útil para quem esteja com o mesmo problema. A sugestão do André me fez analisar e chegar a conclusão que meu real problema era não estar conseguindo enviar a lista decompetências para o controller. No meu caso não foi necessário criar a ViewModel, pois, como é um relacionamento n:n ambas classes (competenciacandidato) possuem uma lista para que entity crie a tabela de relacionamento. Bom, então a primeira parte do meu problema foi resolvida na montagem do html na view. Cada competência é carregada em um checkbox. Para que o controller faça o bind dos checkbox's na propriedade listCompetencia da classe os checkbox devem ser declarados de uma forma que o controller seja capaz de entender isso, ficou assim:

    <input type='checkbox' name="@("listCompetencia[" + i + "].Id" value="@Model.listCompetencia[i].Id" />

    O '@(' no inicio da propriedade name é usado para fazer concatenação no razor, esse input esta sendo criado dentro de um for e eu estou usando o mesmo índice para o for e para os check's, por isso a concatenação no name. Bom, agora que já tenho as informações no controller, bora persistir em ambas tabelas.

    Vlw mesmo pela dica!


    • Editado dani.ela terça-feira, 12 de agosto de 2014 21:14
    • Marcado como Resposta dani.ela terça-feira, 12 de agosto de 2014 21:40
    terça-feira, 12 de agosto de 2014 21:13