none
ASP.NET - retornando mais de um List para view RRS feed

  • Pergunta

  • Pessoal,

    tenho uma página que possui mais de uma Listagem de objetos. Por exemplo, tenho o objeto tema que contem uma lista de indicadores, consequentemente indicadores contem um objeto tema unico. A minha dúvida é quando eu quero passar mais de uma lista de objetos recuperados do banco de dados, como eu faço pra passar essas duas listas???

    Exemplo:

    Temas:
    1. Tema xpto;
    2. Tema xyz;

    Indicadores:
    1. Indicador 1
    2. Indicador 2
    3. Indicador N

     

    Eu tenho tentado passar através de uma Viewdata  apartir do meu controller para a view. Só que eu não vejo ninguem implementando algo do tipo. Nao quer passar através do retorno View(objeto.list()) pq é mais do que uma lista. To desesperado pra achar a solução com algo tão simples! :(((

    Poderiam me ajudar?

     


    Leandro Alves
    sexta-feira, 22 de julho de 2011 14:11

Respostas

  • Leandro, eu não entendi mto bem...Na sua frase:

    "A minha dúvida é quando eu quero passar mais de uma lista de objetos recuperados do banco de dados..."

     

    Vc que passar N listas de objetos para uma View? ?


    Se for isso, uma possibilidade é passar uma coleção encadeada, por exemplo:

        public ViewResult Index()
        {
          List<string> lista1 = new List<string>();
          List<string> lista2 = new List<string>();
          List<string> lista3 = new List<string>();
    
          List<List<string>> listaPai = new List<List<string>>();
          listaPai.Add(lista1);
          listaPai.Add(lista2);
          listaPai.Add(lista3);
    
          return View(listaPai); 
        }
    
    


    E na view percorrer essas listas: 

    @model List<List<string>>
    
    @{
      ViewBag.Title = "Index";
    }
    
    <h2>Index</h2>
    
    @foreach (List<string> lista in Model)
    {
      foreach (string item in lista)
      {
        // ...
      }
    }
    


     


     

    • Marcado como Resposta Leandro Portnoy quarta-feira, 27 de julho de 2011 17:41
    sexta-feira, 22 de julho de 2011 17:10
  • Eu entendo que você vai retornar uma lista de Tema, e acesasr os Indicadores.. Tema.Indicadores.

    Relação: Tema 1-N Indicadores.

    Você tem uma lista de Indicadores na classe Tema, certo!?

     

    • Marcado como Resposta Leandro Portnoy quarta-feira, 27 de julho de 2011 17:41
    sexta-feira, 22 de julho de 2011 17:13

Todas as Respostas

  • Galera

    ...acho que consegui uma solução. Não sei se é a mais elegante, mas foi baseado num artigo postado aqui no msdn... assim que tudo funcionar direitinho eu volto pra responder. Mas fico no aguardo ainda de sugestões. ;)


    Leandro Alves
    sexta-feira, 22 de julho de 2011 15:19
  • Leandro, eu não entendi mto bem...Na sua frase:

    "A minha dúvida é quando eu quero passar mais de uma lista de objetos recuperados do banco de dados..."

     

    Vc que passar N listas de objetos para uma View? ?


    Se for isso, uma possibilidade é passar uma coleção encadeada, por exemplo:

        public ViewResult Index()
        {
          List<string> lista1 = new List<string>();
          List<string> lista2 = new List<string>();
          List<string> lista3 = new List<string>();
    
          List<List<string>> listaPai = new List<List<string>>();
          listaPai.Add(lista1);
          listaPai.Add(lista2);
          listaPai.Add(lista3);
    
          return View(listaPai); 
        }
    
    


    E na view percorrer essas listas: 

    @model List<List<string>>
    
    @{
      ViewBag.Title = "Index";
    }
    
    <h2>Index</h2>
    
    @foreach (List<string> lista in Model)
    {
      foreach (string item in lista)
      {
        // ...
      }
    }
    


     


     

    • Marcado como Resposta Leandro Portnoy quarta-feira, 27 de julho de 2011 17:41
    sexta-feira, 22 de julho de 2011 17:10
  • Eu entendo que você vai retornar uma lista de Tema, e acesasr os Indicadores.. Tema.Indicadores.

    Relação: Tema 1-N Indicadores.

    Você tem uma lista de Indicadores na classe Tema, certo!?

     

    • Marcado como Resposta Leandro Portnoy quarta-feira, 27 de julho de 2011 17:41
    sexta-feira, 22 de julho de 2011 17:13
  • Robson,

    exatamente assim eu consegui fazer. O grande lance é quebra o conceito que eu já tinha do java e passar a utilizar uma lista que contem outras listas, retornando pra view essa coleção. Você entendeu bem sim a minha pergunta. Assim que eu terminar de fazer tudo eu volto pra complementar a minha dúvida já com a resposta anexada, ou melhor, a solução, que foi exatamente esta que voce exemplificou.

     

    abs!


    Leandro Alves
    sexta-feira, 22 de julho de 2011 17:14
  • Então pessoal,

     

    criei um objeto que tem a finalidade de gerenciar os elementos retornados da minha tela. Eles contem lista de meus objetos. Exemplo:

      public class ReportData
      {
        public IEnumerable<Tema> Tema { get; set; }
        public IEnumerable<Indicador> Indicador { get; set; }
      }
    

    Nele eu retorno os list que necessito, no caso o Tema e Indicador. Eu poderia retornar somente os Temas que conteriam seus indicadores relacionados conforme citado anteriormente. Mas para o caso, na minha view eu trabalho com o meu objeto ReportData retornado e percorro suas diversas lista através dos atributos definidos. Exemplo: 

    <%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<Minerva.ViewModel.ReportData>" %>
    
    
    
    <!-- iteração percorrendo minhas listas -->
    <table width="100%">
                <%foreach (var item in Model.Tema)
                {%>
                <tr>
                  <td valign="top" style="width: 10px">
                    <input type="checkbox" class="<%: item.tema_id %>" name="tema_checkbox" id="<%: item.tema_id %>" value="<%: item.descricao %>" onclick="checkAllChildrens(this)" />
                  </td>
                  <td class="editor-field" id="parent"> 
                    <%: item.descricao %>
                    <div>
                      <%foreach (var itemAux in Model.Indicador)
                      {%> 
                        <%if (item.tema_id == itemAux.tema_id)
                        {%>
                          <div>
                            <input type="checkbox" class="<%: itemAux.tema_id %>" name="indicador_checkbox" id="<%: itemAux.tema_id %>" value="<%: itemAux.descricao %>" />
                            <%: itemAux.descricao%>
                          </div>
                        <%}%>
                      
                      <%}%>
                    </div>
                  </td>
                </tr>
                <%}%>
              </table>
    

    é isso. A dúvida, caso não tenham entendido muito bem, é como retornar diversas listas para minha view, independente da sua relação.

     

    Abs!


    Leandro Alves
    quarta-feira, 27 de julho de 2011 17:41
  • Oi Leandro Alves.. vc pode me enviar um codigo explicando bm cmo funciona isso ?

    grata!!

    quarta-feira, 1 de agosto de 2012 18:04
  • Jéssica,

    é exatamente conforme postei o código acima. Um objeto que é similar ao Objeto Form do struts ( se voce conhecer java vai entender sobre o que estou falando ). Mas para todo o caso, eu criei um objeto local que contem as outras entidade em que eu trabalho numa view. Ele pode ser um objeto unico ou conter um lista de outros objetos. Conforme citado acima, eu tenho um tema e N indicadores para esse tema (1-N). 

    Para o meu problema, eu precisava estruturar isso de uma outra forma, sendo que eu poderia trazer os meus IndicadoresList e já ter dentro dele os meus temas (a frame preve isso). 

    Agora nao tenho o código aqui, mas se tiver mais alguma dúvida posso tentar detalhar a resposta mais tarde.

    Espero ter ajudado.

    Abs!


    Leandro Alves

    quarta-feira, 1 de agosto de 2012 18:09