Usuário com melhor resposta
Trabalhando com múltiplos controles DropDrownList de modelos diferentes em uma mesma View

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!
- Editado José Eduardo Castro quinta-feira, 19 de janeiro de 2012 18:00
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.
Site:http://albertomonteiro.net/
Twitter: Me siga!!
Blog:http://blog.albertomonteiro.net/- Marcado como Resposta José Eduardo Castro sexta-feira, 20 de janeiro de 2012 16:33
-
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")%>
- Editado João_ PradoModerator sexta-feira, 20 de janeiro de 2012 15:24
- Marcado como Resposta José Eduardo Castro sexta-feira, 20 de janeiro de 2012 16:33
Todas as Respostas
-
Poderia trazer um pouco de código para facilitar o entendimento
Contato: alberto.monteiro@live.com - Se ajudei, marca como útil.
Site:http://albertomonteiro.net/
Twitter: Me siga!!
Blog:http://blog.albertomonteiro.net/ -
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!
- Editado José Eduardo Castro quinta-feira, 19 de janeiro de 2012 20:31
-
-
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.
Site:http://albertomonteiro.net/
Twitter: Me siga!!
Blog:http://blog.albertomonteiro.net/- Marcado como Resposta José Eduardo Castro sexta-feira, 20 de janeiro de 2012 16:33
-
-
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")%>
- Editado João_ PradoModerator sexta-feira, 20 de janeiro de 2012 15:24
- Marcado como Resposta José Eduardo Castro sexta-feira, 20 de janeiro de 2012 16:33
-