none
Utilizar mais de uma model em uma única View em MVC4. RRS feed

  • Pergunta

  • Pessoal estou com uma dúvida. 

    Na minha aplicação eu irei necessitar ter um Menu que estou desenvolvendo com o layout no estilo do menu do windows 8.

    Como esse menu será criado dinamicamente pelo banco de dados, eu vou necessitar que a minha View seja tipada. 

    O rolo é o seguinte, eu irei ter três tipos de classes não realacionadas, sendo elas, Favoritos, Mais Acessados e o Menu Principal. 

    Por se tratar de uma única View a conter estes três itens separados eu irei necessitar das três Models, já pesquisei mas nao encontrei nada relacionado como Uma View utilizando 3 Models. 

    Alguém pode me ajudar? 

    Dar idéias, postar algum link que explique algum outro conceito para se trabalhar dessa maneira? 

    Obrigado.

    quinta-feira, 5 de setembro de 2013 14:02

Respostas

  • Fernando,

    Há quem prefira ao invés de utilizar ViewBag para colocar estes dados de forma temporária, mas sim criar uma ViewModel para adaptar as propriedades necessárias para aquele contexto, mantendo apenas em uma Model, exemplo:

    public class MasterLayoutViewModel
    {
        public User Usuario { get; set; }
        public List<Permission> Permissoes { get; set; }
        public List<Menu> Menus { get; set; }
    }

    No MVC:

    @model SeuNamespace.MasterLayoutViewModel


    Vitor Mendes | http://www.vitormendes.com.br/

    "Ajuda teu semelhante a levantar a sua carga, porém, não a carregá-la." (Pitágoras)

    • Marcado como Resposta Fernando Mamprin quinta-feira, 5 de setembro de 2013 14:59
    quinta-feira, 5 de setembro de 2013 14:28
  • Caro Fernando Mamprin

    O uso do PartialView te auxiliará na manutenção, na limpeza do código e isso é muito importante!

    Melhor forma de implementação!

    Criar as 3 ViewBag no Controller e na View Principal pegar partes desse View jogar em PartialView e renderizar com o os models vindos do Controller

    Essa é a minha opinião!


    Fúlvio Cezar Canducci Dias

    • Marcado como Resposta Fernando Mamprin quinta-feira, 5 de setembro de 2013 19:37
    quinta-feira, 5 de setembro de 2013 19:11

Todas as Respostas

  • Assim,

    Por ViewBag (ou ViewData) se pode transpor da Action para View 

    e na sua View fazer o Cast para pegar os dados em tempo de execução!

    na sua Action

    ViewBag.Model1 = new Seguranca.Lista();

    na sua View (como segurança retorna uma lista de segurança por exemplo se faz assim)

    @{
        var Lista = ViewBag.Model1 as IList<Seguranca>;
    }

    Ai você consegue trabalhar com várias ViewBag dentro de uma View!!!

    http://eduardopires.net.br/2013/06/asp-net-mvc-viewdata-viewbag-tempdata/

    http://weblogs.asp.net/hajan/archive/2010/12/11/viewbag-dynamic-in-asp-net-mvc-3-rc-2.aspx


    Fúlvio Cezar Canducci Dias


    quinta-feira, 5 de setembro de 2013 14:09
  • Como o Fúlvio disse, utilize ViewBag

    no seu controller 

    public ActionResult Index() 
    {
        ViewBag.Favoritos = sua lista
        ViewBag.MaisAcessados = sua lista
        ViewBag.MenuPrincipal = sua lista
        return View();
    }

    ai na sua view é só acessar a ViewBag 

    @ViewBag.Favoritos
    @ViewBag.MaisAcessados
    @ViewBag.MenuPrincipal


    Rafael O. Marques

    quinta-feira, 5 de setembro de 2013 14:22
  • Fernando,

    Há quem prefira ao invés de utilizar ViewBag para colocar estes dados de forma temporária, mas sim criar uma ViewModel para adaptar as propriedades necessárias para aquele contexto, mantendo apenas em uma Model, exemplo:

    public class MasterLayoutViewModel
    {
        public User Usuario { get; set; }
        public List<Permission> Permissoes { get; set; }
        public List<Menu> Menus { get; set; }
    }

    No MVC:

    @model SeuNamespace.MasterLayoutViewModel


    Vitor Mendes | http://www.vitormendes.com.br/

    "Ajuda teu semelhante a levantar a sua carga, porém, não a carregá-la." (Pitágoras)

    • Marcado como Resposta Fernando Mamprin quinta-feira, 5 de setembro de 2013 14:59
    quinta-feira, 5 de setembro de 2013 14:28
  • Obrigado pela resposta Vitor, irei atras de aprofundar os meus conhecimentos na ViewModel para poder melhor entender tal conceito e utiliza-lo na minha aplicação. 

    Vitor se não for abuso, ouvi muito se dizer também em PartialView. Para casos como esse qual é o mais aconselhável na sua opinião. Mais uma vez obrigado pela ajuda. 

    Agradeço também ao colegas Rafael e ao Fúlvio pelas dicas. 

    Abras

    quinta-feira, 5 de setembro de 2013 14:58
  • Olá Fernando,

    Você poderia sim usar PartialViews para conseguir o máximo de reaproveitamento de conteúdo sem muita repetição, até porque este menu poderá ser renderizado outro dia em outro parte da tela alem do header.

    A sua duvida é sobre PartialViews é porque você não conhece ou não sabe como emprega-las de forma correta ?

    Vitor Mendes | http://www.vitormendes.com.br/

    "Ajuda teu semelhante a levantar a sua carga, porém, não a carregá-la." (Pitágoras)

    quinta-feira, 5 de setembro de 2013 18:33
  • Fernando,

    Há quem prefira ao invés de utilizar ViewBag para colocar estes dados de forma temporária, mas sim criar uma ViewModel para adaptar as propriedades necessárias para aquele contexto, mantendo apenas em uma Model, exemplo:

    public class MasterLayoutViewModel
    {
        public User Usuario { get; set; }
        public List<Permission> Permissoes { get; set; }
        public List<Menu> Menus { get; set; }
    }

    No MVC:

    @model SeuNamespace.MasterLayoutViewModel


    Vitor Mendes | http://www.vitormendes.com.br/

    "Ajuda teu semelhante a levantar a sua carga, porém, não a carregá-la." (Pitágoras)

    Desculpa mas, eu não podia ficar quieto!

    Em relação a esse ViewModel é um conceito de FACADE: http://salmanqayyum.com/2009/07/10/facade-design-pattern-in-c/ !!!


    Fúlvio Cezar Canducci Dias

    quinta-feira, 5 de setembro de 2013 18:55
  • Vitor a ideia inicial para esse menu, é ele ser parecido com o menu do windows 8 e não com um menu normal. 

    Antes de postar minha dúvida aqui, eu andei pesquisando sobre a utilização de várias Models e uma única View e vi em vários artigos o uso do PartialView. 

    Até então eu estava achando que era a única solução. 

    Mas já vi que não é. O que eu pude entender sobre o PartialViews é que eles se assemelham muito com os UserControls utilizados la no WebForms. 

    A minha dúvida em si, se trata de qual a melhor solução utilizar para tal implementação. É mais uma comparação entre os dois, pensando em uma manutenção futura.

    Obrigado mais uma vez. 

    quinta-feira, 5 de setembro de 2013 19:02
  • Caro Fernando Mamprin

    O uso do PartialView te auxiliará na manutenção, na limpeza do código e isso é muito importante!

    Melhor forma de implementação!

    Criar as 3 ViewBag no Controller e na View Principal pegar partes desse View jogar em PartialView e renderizar com o os models vindos do Controller

    Essa é a minha opinião!


    Fúlvio Cezar Canducci Dias

    • Marcado como Resposta Fernando Mamprin quinta-feira, 5 de setembro de 2013 19:37
    quinta-feira, 5 de setembro de 2013 19:11
  • Fala Fúlvio. 

    Como ainda estou iniciando em MVC4, tenho muito a aprender, eu já implementei algumas aplicações simples com cadastro de cliente inclusão exclusão, sem utilizar os scaffolds que o MVC tem para nos facilitar. Tudo isso para aprender realmente. 

    Eu até peço desculpas a vocês, pois, poderia ser uma discutição geral e não uma dúvida, mas, com as respostas foram surgindo mais dúvidas e por ai vai. 

    Quanto ao uso do PartialView, se eles realmente se assemelham muito com os UserControls, é realmente necessário eu utilizar ViewBag? Eu não posso efetuar a chamada das Views passando as Models como parâmetros utilizando assim minhas Views Tipadas? 

    É que eu quero deixar esse código o mais simples possível, já que não serei apenas eu o desenvolvedor envolvido com essa aplicação.

    Um Abraço.

    quinta-feira, 5 de setembro de 2013 19:29
  • Fala Fúlvio. 

    Como ainda estou iniciando em MVC4, tenho muito a aprender, eu já implementei algumas aplicações simples com cadastro de cliente inclusão exclusão, sem utilizar os scaffolds que o MVC tem para nos facilitar. Tudo isso para aprender realmente. 

    Eu até peço desculpas a vocês, pois, poderia ser uma discutição geral e não uma dúvida, mas, com as respostas foram surgindo mais dúvidas e por ai vai. 

    Quanto ao uso do PartialView, se eles realmente se assemelham muito com os UserControls, é realmente necessário eu utilizar ViewBag? Eu não posso efetuar a chamada das Views passando as Models como parâmetros utilizando assim minhas Views Tipadas? 

    É que eu quero deixar esse código o mais simples possível, já que não serei apenas eu o desenvolvedor envolvido com essa aplicação.

    Um Abraço.

    O ViewBag é para você transportar os dados ... e se você dentro de uma view tiver 1 PartialView Tipada e precisar carregala com algum dados vai ser pelo ViewBag ou ViewData ...

    Entendeu!


    Fúlvio Cezar Canducci Dias

    quinta-feira, 5 de setembro de 2013 19:43
  • Que o transporte de dados é feito pelo ViewBag ou ViewData isso eu sei. 

    A minha dúvida é: Se o PartialView se comportará como uma View convencional. Porque se acaso sim, eu posso utilizar o scaffolding do tipo List, deixando minha Controller mais limpa. 

    quinta-feira, 5 de setembro de 2013 19:58
  • Cara preste atenção!!!

    Se você tiver uma View e dentro dela vários PartialView Tipadas deverá transporta dados que você já disse claramente que já sabe!

    A PartialView é renderizada igual a View tem o comportamente semelhante e pode ser utilizada com Ajax por exemplo e model tipado! 

    Exemplo:

    1 - Partial_Pessoas.cshtml

    @model IEnumerable<MvcAppHome.Models.Pessoa>
    <p>
        @Html.ActionLink("Create New", "Create")
    </p>
    <table>
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.Nome)
            </th>
            <th></th>
        </tr>
    
    @foreach (var item in Model) {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.Nome)
            </td>
            <td>
                @Html.ActionLink("Edit", "Edit", new { id=item.Id }) |
                @Html.ActionLink("Details", "Details", new { id=item.Id }) |
                @Html.ActionLink("Delete", "Delete", new { id=item.Id })
            </td>
        </tr>
    }
    </table>

    2 - View

    @model IEnumerable<MvcAppHome.Models.Pessoa>
    
    @{
        ViewBag.Title = "Pessoas";
    }
    
    @Html.Partial("Partial_Pessoas", Model)

    A View chama dentro dela um PartialView e passa seu Model junto ...

    Vamos dizer que além desse PartialView tenha outra: Ai por ViewBag se transporta um outro model igual você disse que já entendeu!

    Exemplo:

    @model IEnumerable<MvcAppHome.Models.Pessoa>
    
    @{
        ViewBag.Title = "Pessoas";
    }
    
    @Html.Partial("Partial_Pessoas", Model)
    @Html.Partial("Partial_Carros", ViewBag.Carros as List<Carros>)

    Essa é uma maneira a outra é via ajax:

    http://stackoverflow.com/questions/7430976/rendering-partial-views-using-ajax

    Bom espero que tenha te ajudado e não atrapalhado!

    A gente gosta sempre de ajudar e fica feliz quando consegue!

    T+


    Fúlvio Cezar Canducci Dias

    quinta-feira, 5 de setembro de 2013 23:07
  • Fernando,

    Há quem prefira ao invés de utilizar ViewBag para colocar estes dados de forma temporária, mas sim criar uma ViewModel para adaptar as propriedades necessárias para aquele contexto, mantendo apenas em uma Model, exemplo:

    public class MasterLayoutViewModel
    {
        public User Usuario { get; set; }
        public List<Permission> Permissoes { get; set; }
        public List<Menu> Menus { get; set; }
    }

    No MVC:

    @model SeuNamespace.MasterLayoutViewModel


    Vitor Mendes | http://www.vitormendes.com.br/

    "Ajuda teu semelhante a levantar a sua carga, porém, não a carregá-la." (Pitágoras)

    Desculpa mas, eu não podia ficar quieto!

    Em relação a esse ViewModel é um conceito de FACADE: http://salmanqayyum.com/2009/07/10/facade-design-pattern-in-c/ !!!


    Fúlvio Cezar Canducci Dias

    Exatamente Fulvio,

    Ha quem defenda o uso de ViewBag para este tipo ceneraio ou a criação de uma de uma ViewModel fazendo com que sua Model se adapte as necessidades da a UI e não ao contrario, a questão que o Fernando havia levantado é que ele precisava de algo fortemente ripado para a montagem dessa tela, dei uma sugestão e em momento algum discordo da soluçao proposta por você :)


    Vitor Mendes | http://www.vitormendes.com.br/

    "Ajuda teu semelhante a levantar a sua carga, porém, não a carregá-la." (Pitágoras)

    sexta-feira, 6 de setembro de 2013 01:19
  • Fernando,

    Há quem prefira ao invés de utilizar ViewBag para colocar estes dados de forma temporária, mas sim criar uma ViewModel para adaptar as propriedades necessárias para aquele contexto, mantendo apenas em uma Model, exemplo:

    public class MasterLayoutViewModel
    {
        public User Usuario { get; set; }
        public List<Permission> Permissoes { get; set; }
        public List<Menu> Menus { get; set; }
    }

    No MVC:

    @model SeuNamespace.MasterLayoutViewModel


    Vitor Mendes | http://www.vitormendes.com.br/

    "Ajuda teu semelhante a levantar a sua carga, porém, não a carregá-la." (Pitágoras)

    Desculpa mas, eu não podia ficar quieto!

    Em relação a esse ViewModel é um conceito de FACADE: http://salmanqayyum.com/2009/07/10/facade-design-pattern-in-c/ !!!


    Fúlvio Cezar Canducci Dias

    Exatamente Fulvio,

    Ha quem defenda o uso de ViewBag para este tipo ceneraio ou a criação de uma de uma ViewModel fazendo com que sua Model se adapte as necessidades da a UI e não ao contrario, a questão que o Fernando havia levantado é que ele precisava de algo fortemente ripado para a montagem dessa tela, dei uma sugestão e em momento algum discordo da soluçao proposta por você :)


    Vitor Mendes | http://www.vitormendes.com.br/

    "Ajuda teu semelhante a levantar a sua carga, porém, não a carregá-la." (Pitágoras)

    Então nem eu discordo de você, até gostei pelo fato do Design Patterns FACADE, parabéns muito legal seu post!

    Fúlvio Cezar Canducci Dias

    sexta-feira, 6 de setembro de 2013 01:22
  • Obrigado Fúlvio, obrigado Vitor, pelas dicas, soluções e conselhos aqui postados. 

    Abriram meu horizontes para novos estudos e para que eu consiga resolver o meu problema. 

    Agora vou pegar essas dicas e dar continuidade ao desenvolvimento da minha aplicação. 

    Abraço a todos.

    sexta-feira, 6 de setembro de 2013 12:22
  • Obrigado Fúlvio, obrigado Vitor, pelas dicas, soluções e conselhos aqui postados. 

    Abriram meu horizontes para novos estudos e para que eu consiga resolver o meu problema. 

    Agora vou pegar essas dicas e dar continuidade ao desenvolvimento da minha aplicação. 

    Abraço a todos.

    É como o Fulvio disse um pouco acima, gostamos de ajudar e quando conseguimos ficamos bastante felizes :)

    Espero que um dia você possa contribuir tanto quanto muitos tem contribuído aqui neste fórum.

    Vitor Mendes | http://www.vitormendes.com.br/

    "Ajuda teu semelhante a levantar a sua carga, porém, não a carregá-la." (Pitágoras)

    sexta-feira, 6 de setembro de 2013 12:25