none
Trabalhando com múltiplos controles DropDrownList de modelos diferentes em uma mesma View RRS feed

  • Pergunta

  • Caros,

    Estou iniciando com ASP.NET MVC na versão 3 e estou utilizando o Entity Framework. O projeto trabalha com Entity Object e não tenho objetivo de criar classes POCO.

    Estou com a seguinte dúvida:

    Preciso construir uma tela que terá cinco DropDownList para filtrar um determinado GridView. Desses controles DropDownList, quatro são extraídos diretamente da respectiva tabela (id e nome), enquanto o quinto é populado a partir de uma consulta com junção de tabelas e condições.

    Ou seja, para preencher esses cinco controles, vou precisar trabalhar com no mínimo cinco tabelas diferentes.

    Vi alguns exemplos básicos onde o resultado era passado por ViewModel, mas no meu caso eu preciso de várias consultas pra exibir na View.

    Quais são as opções que tenho?

    Não tenho experiência anterior com MVC e talvez eu esteja com alguns conceitos errados.

    Obrigado desde já!

    Abraços!


    quinta-feira, 19 de janeiro de 2012 17:59

Respostas

  • Pelo que você mostrou ai, você já esta criando um objeto anonimo com duas propriedades, id e texto.

    Dessa maneira você precisa simplesmente usar um SelectList

    ViewBag.QuintoDropDown = new SelectList(leisAssuntos, "id", "texto");
    

    Ai é so usar esse valor da viewbag na sua view.

    E como o colega João Prado comentou seria interessante você separar isso em um serviço


    Contato: alberto.monteiro@live.com - Se ajudei, marca como útil.
    Twitter: Me siga!!
    Blog:http://blog.albertomonteiro.net/

    Site:http://albertomonteiro.net/

    quinta-feira, 19 de janeiro de 2012 21:12
  • Neste caso no controller você recebe a consulta e passa para a viewbag como objeto anônimo. No meu caso uso uma classe "ListExtension" para facilitar.

    Mais ou menos assim:

    ListExtension.cs

     

        public static class ListExtensions
        {
            public static IEnumerable<T> ForEach<T>(this IEnumerable<T> collection, Action<T> action)
            {
                foreach (var item in collection) action(item);
                return collection;
            }
    
            public static SelectList ToSelectList<T>(this IEnumerable<T> collection)
            {
                return new SelectList(collection, "Key", "Value");
            }
    
            public static SelectList ToSelectList<T>(this IEnumerable<T> collection, string selectedValue)
            {
                return new SelectList(collection, "Key", "Value", selectedValue);
            }
    
            public static SelectList ToSelectList<T>(this IEnumerable<T> collection, string dataValueField, string dataTextField)
            {
                return new SelectList(collection, dataValueField, dataTextField);
            }
    
            public static SelectList ToSelectList<T>(this IEnumerable<T> collection, string dataValueField, string dataTextField, string selectedValue)
            {
                return new SelectList(collection, dataValueField, dataTextField, selectedValue);
            }
        }
    

     


    No controller:

     

    ViewData["dropdown"] = ListExtensions.ToSelectList(new Lista(), "ParamValue", "ParamText");
    

    Claro que você deve substituir os parâmetros acima (Lista, ParamValue, ParamText) para o seu caso.

     

    Na view:

     

    <%= Html.DropDownList("dropdown")%>
    


    sexta-feira, 20 de janeiro de 2012 15:23
    Moderador

Todas as Respostas

  • Poderia trazer um pouco de código para facilitar o entendimento

    Contato: alberto.monteiro@live.com - Se ajudei, marca como útil.
    Twitter: Me siga!!
    Blog:http://blog.albertomonteiro.net/

    Site:http://albertomonteiro.net/

    quinta-feira, 19 de janeiro de 2012 20:07
  • Alberto,

    Tenho uma classe modelo chamada LeisMunicipaisModel, que possui a seguinte estrutura:

        public class LeisMunicipaisModel
        {
            public Leis Leis { get; set; }
            public Leis_Assuntos LeisAssuntos { get; set; }
            public Leis_LeisAssuntos LeisLeisAssuntos { get; set; }
            public Leis_Decretos LeisDecretos { get; set; }
            public Leis_Escritorios LeisEscritorios { get; set; }
            public Leis_Mandados LeisMandados { get; set; }
        }
    

    Os atributos desta classe são objetos do tipo Entity Object, referentes a classes geradas pelo Entity Framework.

    Vou construir uma View que terá cinco controles DropDownList.

    Quatro DropDownList serão preenchidos através de uma consulta simples, como essa abaixo:

                var escritorios = (from e in contexto_LeisMunicipais.Leis_Escritorios 
                                           select new { id = e.id_escritorio, texto = e.escritorio }).ToList();

    Sendo que cada um desses 4 obterá dados de uma tabela diferente.

    Por fim, o último dropdownlist será populado através de uma consulta similar a esta:

                var leisAssuntos = (from assunto in contexto_LeisMunicipais.Leis_Assuntos
                                    join assuntoLeis in contexto_LeisMunicipais.Leis_LeisAssuntos on assunto.Id_assunto equals assuntoLeis.id_assunto
                                    join leis in contexto_LeisMunicipais.Leis on assuntoLeis.id_lei equals leis.id_lei
                                    where !string.IsNullOrEmpty(assunto.Assunto)
                                    select new
                                               {
                                                   id = assunto.Id_assunto,
                                                   texto = assunto.Assunto
                                               }).Distinct().OrderBy((a => a.id)).ToList();
    

    As dúvidas são:

    1- Como criar corretamente uma classe de modelo que represente várias classes criadas pelo Entity Framework.

    2- Como popular controles DropDownList em uma View, utilizando a classe de modelo acima. Cada dropdownlist obterá dados de uma classe distinta.

    3- Creio que as consultas citadas acima devam estar na Controller, certo? Se sim, qual a melhor forma de implementá-las e associar com os modelos para disponibilizar o conteúdo a View?

    Abraços!

    quinta-feira, 19 de janeiro de 2012 20:29
  • Eu não colocaria as consultas dentro do controller.

    Crie uma camada de serviço para popular suas dropdowns.

     

    quinta-feira, 19 de janeiro de 2012 20:59
    Moderador
  • Pelo que você mostrou ai, você já esta criando um objeto anonimo com duas propriedades, id e texto.

    Dessa maneira você precisa simplesmente usar um SelectList

    ViewBag.QuintoDropDown = new SelectList(leisAssuntos, "id", "texto");
    

    Ai é so usar esse valor da viewbag na sua view.

    E como o colega João Prado comentou seria interessante você separar isso em um serviço


    Contato: alberto.monteiro@live.com - Se ajudei, marca como útil.
    Twitter: Me siga!!
    Blog:http://blog.albertomonteiro.net/

    Site:http://albertomonteiro.net/

    quinta-feira, 19 de janeiro de 2012 21:12
  • Alberto,

    E caso minha consulta não retornasse um objeto anônimo e sim com o tipo de uma classe?

    Qual seria a melhor forma para exibir os dados no controle DropDownlist considerando este cenário?

    Abraços!

    sexta-feira, 20 de janeiro de 2012 14:56
  • Neste caso no controller você recebe a consulta e passa para a viewbag como objeto anônimo. No meu caso uso uma classe "ListExtension" para facilitar.

    Mais ou menos assim:

    ListExtension.cs

     

        public static class ListExtensions
        {
            public static IEnumerable<T> ForEach<T>(this IEnumerable<T> collection, Action<T> action)
            {
                foreach (var item in collection) action(item);
                return collection;
            }
    
            public static SelectList ToSelectList<T>(this IEnumerable<T> collection)
            {
                return new SelectList(collection, "Key", "Value");
            }
    
            public static SelectList ToSelectList<T>(this IEnumerable<T> collection, string selectedValue)
            {
                return new SelectList(collection, "Key", "Value", selectedValue);
            }
    
            public static SelectList ToSelectList<T>(this IEnumerable<T> collection, string dataValueField, string dataTextField)
            {
                return new SelectList(collection, dataValueField, dataTextField);
            }
    
            public static SelectList ToSelectList<T>(this IEnumerable<T> collection, string dataValueField, string dataTextField, string selectedValue)
            {
                return new SelectList(collection, dataValueField, dataTextField, selectedValue);
            }
        }
    

     


    No controller:

     

    ViewData["dropdown"] = ListExtensions.ToSelectList(new Lista(), "ParamValue", "ParamText");
    

    Claro que você deve substituir os parâmetros acima (Lista, ParamValue, ParamText) para o seu caso.

     

    Na view:

     

    <%= Html.DropDownList("dropdown")%>
    


    sexta-feira, 20 de janeiro de 2012 15:23
    Moderador
  • Agradeço a todos que colaboraram.

    Abraços!

    sexta-feira, 20 de janeiro de 2012 16:34