none
Fazer um foreach dentro de uma cshtml(view) vindo de uma controller RRS feed

  • Pergunta

  • Fiz um código usando linq e jquery. Acontece que está me dando um problema que não consigo resolver, que é criar um treeview dinamicamente. Então tive outra idéia. Fazer o foreach direto na View(CSHTML). Aí vem a pergunta, como eu faço um foreach dentro da View e em cima de um resultado de uma linq que está em minha controller.

    Controller:

    [HttpPost]
            public JsonResult ArvoreAcao(string _uf)
            {
                RupturaEntities db = new RupturaEntities();

                var monta_arvore = (from rup in db.Ruptura
                                      from apr in db.Apresentacao.Where(apr => apr.Codigo_Apresentacao == rup.Codigo_Apresentacao)
                                      from pdv in db.PDV.Where(pdv => pdv.CodigoPDV == rup.CodigoPDV)
                                      from mot in db.Motivo.Where(mot => mot.IDMotivo == rup.IDMotivo)

                                      select new {
                                          rup.IDRuptura,
                                          rup.DataRuptura,
                                          rup.IDMotivo,
                                          mot.Motivo1,
                                          rup.IDOrigem,
                                          rup.CodigoPDV,
                                          pdv.UF,
                                          pdv.Cidade,
                                          loja = pdv.Cnpj + " - " + pdv.Descricao,
                                          rup.Codigo_Apresentacao,
                                          apr.Unidade_Negocio,
                                          apr.Franquia,
                                          apr.Familia,
                                          apr.Descricao}).ToList().Distinct().OrderBy(apr => apr.Descricao);

                return Json(new { monta_arvore }, JsonRequestBehavior.AllowGet);
            }

    View.

    @{
        ViewBag.Title = "Acao";
        Layout = "~/Views/Shared/_LayoutBase.cshtml";
    }

    <link href="~/Content/Jqwidgets/jqx.base.css" rel="stylesheet" type="text/css" />

    <h2>Tomada de Ação</h2>

    <div class="row">
        <div class="col-md-12">
            <div class="col-md-1">
                <label for="cbxCodTipo">UF:</label>
            </div>
            <div class="col-md-4">
                <select class="form-control col-md-6" name="cbxCodTipo" id="cbxCodTipo" onchange=" return MontaCidades();">
                    <option value="00">Selecione um estado</option>
                    <option value="AC">ACRE</option>
                    <option value="AL">ALAGOAS</option>
                    <option value="AP">AMAPÁ</option>
                    <option value="AM">AMAZONAS</option>
                    <option value="BA">BAHIA</option>
                    <option value="CE">CEARÁ</option>
                    <option value="DF">DISTRITO FEDERAL</option>
                    <option value="ES">ESPÍRITO SANTO</option>
                    <option value="GO">GOIÁS</option>
                    <option value="MA">MARANHÃO</option>
                    <option value="MT">MATO GROSSO</option>
                    <option value="MS">MATO GROSSO DO SUL</option>
                    <option value="MG">MINAS GERAIS</option>
                    <option value="PA">PARÁ</option>
                    <option value="PB">PARAÍBA</option>
                    <option value="PR">PARANÁ</option>
                    <option value="PE">PERNAMBUCO</option>
                    <option value="PI">PIAUÍ</option>
                    <option value="RJ">RIO DE JANEIRO</option>
                    <option value="RN">RIO GRANDE DO NORTE</option>
                    <option value="RS">RIO GRANDE DO SUL</option>
                    <option value="RO">RONDÔNIA</option>
                    <option value="RR">RORAIMA</option>
                    <option value="SC">SANTA CATARINA</option>
                    <option value="SP">SÃO PAULO</option>
                    <option value="SE">SERGIPE</option>
                    <option value="TO">TOCANTINS</option>
                </select>
            </div>
            <div class="col-md-6">
                <div class="col-md-2">
                    <label for="cbxCidade">Cidade:</label>
                </div>
                <select class="form-control col-md-4" name="cbxCidade" id="cbxCidade"></select>
            </div>
        </div>

        <div class="col-md-12">
            <div class="col-md-1">
                <label for="cbxRede">Rede:</label>
            </div>
            <div class="col-md-4">
                <select class="form-control col-md-6" name="cbxRede" id="cbxRede"></select>
            </div>
            <div class="col-md-6">
                <div class="col-md-2">
                    <label for="cbxRede">Descrição:</label>
                </div>
                <select class="form-control col-md-4" name="cbxDescricao" id="cbxDescricao"></select>
            </div>
        </div>

        <div class="col-md-12">
            <div class="col-md-1">
                <label for="cbxProduto">Produto:</label>
            </div>
            <div class="col-md-4">
                <select class="form-control col-md-6" name="cbxProduto" id="cbxProduto"></select>
            </div>
        </div>

        <div class="col-md-12">
            <div class="col-md-1">
                <label for="cbxUnNegocio">Unidade Negócio:</label>
            </div>
            <div class="col-md-4">
                <select class="form-control col-md-6" name="cbxUnNegocio" id="cbxUnNegocio"></select>
            </div>
        </div>
    </div>

    <br />

    <div id="content">
        <div class="listTree"></div>
        <button class="btn btn-primary" onclick=" return MontaArvore();">Pesquisar</button>
    </div>

    <br>

    <div id='jqxWidget'>
        <div style='float: left; width:auto;'>
            <div id='jqxTree' style=' float: left; margin-'>
                <ul>
                    <li item-checked='false' item-expanded='false'>
                        Produto
                        <ul>
                                <li item-expanded='true'>
                                    MIP
                                    <ul>
                                        <li item-expanded='true'>
                                            Família: ACCUVIT
                                            <ul>
                                                <li>ACCUVIT COMREV FRX30</li>
                                            </ul>
                                        </li>
                                        <li item-expanded='true'>
                                            Família: FLOGORAL
                                            <ul>
                                                <li>FLOGORAL SPRAY CEREJA CTX30ML</li>
                                                <li>FLOGORAL SPRAY MENTA CTX30ML</li>
                                                <li>FLOGORAL CREM DENTAL CTX70G</li>
                                            </ul>
                                        </li>
                                    </ul>
                                </li>
                            </ul>
                    </li>
                </ul>

            </div>

            <div style='margin- float: left;'>
                <div style='margin-'>
                    <input id='jqxCheckBox' type="hidden">
                </div>
            </div>

        </div>
    </div>@*Fim da div jqxWidget *@

        <div class="row">
            <div class="col-md-12">
                <div class="col-md-2">
                    <label for="txtObs">Observação:</label>
                </div>
                <div class="col-md-12">
                    <textarea id="txtObs" style="width: 450px;"></textarea>
                </div>
            </div>
        </div>

        <br />

        <div id="content">
            <div class="listTree"></div>
            <button class="btn btn-success" ">Gravar</button>
            @Html.ActionLink("Voltar", "Index", "Home", new { }, new { @class = "btn btn-danger" })
        </div>

        @*<script class="cssdeck" src="//cdnjs.cloudflare.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>*@
        <script class="cssdeck" src="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/2.3.1/js/bootstrap.min.js"></script>

        <script src="~/Scripts/Acao/Acao.js"></script>
        <script src="~/Scripts/Jqwidgets/jqxcore.js"></script>
        <script src="~/Scripts/Jqwidgets/jqxbuttons.js"></script>
        <script src="~/Scripts/Jqwidgets/jqxscrollbar.js"></script>
        <script src="~/Scripts/Jqwidgets/jqxpanel.js"></script>
        <script src="~/Scripts/Jqwidgets/jqxtree.js"></script>
        <script src="~/Scripts/Jqwidgets/jqxcheckbox.js"></script>

    Importante: A controller se Chama AcaoController. O .edmx está dentro de Model(Folder) e uso Entity.

    quinta-feira, 11 de setembro de 2014 16:59

Respostas

  • Se você faz isso na controller  

    var resultado_arvore = (from i in db....  select new {......}).ToList();

    return View(resultado_arvore.ToList())

    Na sua View você irá fazer assim:

     <ul>
           @foreach (var item in Model){
               <li>
                    @item.Name
               </li>
          }
    </ul>

    Mas no import da sua model na view ela tem que ser assim:

    @model IEnumerable<ResultadoArvore>
    Suspeito nesse caso que ResultadoArvore seja sua model.




    • Editado Fernando Mamprin sexta-feira, 12 de setembro de 2014 13:54
    • Sugerido como Resposta RZVieira terça-feira, 16 de setembro de 2014 12:25
    • Não Sugerido como Resposta pnet terça-feira, 16 de setembro de 2014 14:30
    • Marcado como Resposta pnet terça-feira, 16 de setembro de 2014 14:30
    sexta-feira, 12 de setembro de 2014 13:50

Todas as Respostas

  • Mais uma pergunta. Eu preciso fazer um foreach na view de um resultado de uma linq que está na controller. Como eu digo que o foreach é relativo ao resulatdo do linq?
    quinta-feira, 11 de setembro de 2014 17:49
  • Se voce não for usar model, pode devolver em um ViewData.

    Att,

    quinta-feira, 11 de setembro de 2014 18:38
  • Tô boiando. Eu quero apenas é saber como eu identifico na minha view que o model ou Model que eu estou usando é o resultado da minha linq lá na controller. Como informo isso? Com using? Se sim, como eu faço. Tipo:

    @foreach(var item in Model.o_que_coloco_aqui){}

    Não sei se eu estou conseguindo passar minha dúvida para vocês.

    sexta-feira, 12 de setembro de 2014 10:09
  • Fiz isso na controller:

        ViewBag.result_arvore = monta_arvore;

    E depois isso na view.


        @foreach (var item in ViewBag.result_arvore)
                    {
                        <ul>
                            <li item-checked='false' item-expanded='false'>
                                @item.Motivo1
                            </li>
                        </ul>
                    }

    O resultado é esse:

    Como eu faço um foreach, mas em cima do resultado de uma linq que vem da controller?

     
    sexta-feira, 12 de setembro de 2014 12:24
  •   <ul>
                    @foreach (var banner in ViewData["Banners"] as List<Prototype.Models.Banner>)
                    {
                        <li>
                            <img src="~/upload/banner/@banner.Imagem" alt="@banner.Titulo" />
                        </li>
                    }
                </ul>


      ViewData["Banners"] = banners.FindAll(b => b.local ==0);

    Eu faço assim!! 

    Abs

    sexta-feira, 12 de setembro de 2014 12:47
  • Eu estou realmente apanhando. Não entendi bem o que você postou. Veja a minha necessidade: A minha linq é essa e é trabalhando em cima do resultado dela que eu preciso.

    var resultado_arvore = (from i in db....

                          select new {......}).ToList();

    Na variável "resultado_arvore" eu trago tudo que vou precisar para montar a minha view. Agora, preciso criar uma estrutura de árvore e nela ir montando uns checkbox. Não consegui fazer com jquery, segundo um outro post que fiz. Aí então, tive a idéia de montar diretamente na view, fazendo foreach e etc... Acontece que estou tendo dificuldade de entender isso. Não entendi por exemplo, o tipo da lista que você propôs, não sei como eu faria isso no meu exemplo.

    sexta-feira, 12 de setembro de 2014 13:01
  • Entendi, na verdade estou usando a lista de um objeto do tipo Banner. Que contem propriedades como Id, Nome, Descricao e tal.

    Na minha controller eu preencho essa lista, atribuo ela à um ViewData["QualquerNome"] quando dou o return na View, recebo essa ViewData no cshtml e faço a iteração como se fosse no code behind.

    Lembrando que tem várias formas de fazer isso, nesse caso implementei assim.


    sexta-feira, 12 de setembro de 2014 13:13
  • Acho que não estou conseguindo passar minha dúvida. Vou tentar de outra forma. Como eu pego o resultado da minha consulta em LINQ que fiz na controller no meu cshtml? Como eu vou fazer um foreach ou outra coisa e dizer que tudo isso vem do resultado da minha LINQ?
    sexta-feira, 12 de setembro de 2014 13:45
  • Se você faz isso na controller  

    var resultado_arvore = (from i in db....  select new {......}).ToList();

    return View(resultado_arvore.ToList())

    Na sua View você irá fazer assim:

     <ul>
           @foreach (var item in Model){
               <li>
                    @item.Name
               </li>
          }
    </ul>

    Mas no import da sua model na view ela tem que ser assim:

    @model IEnumerable<ResultadoArvore>
    Suspeito nesse caso que ResultadoArvore seja sua model.




    • Editado Fernando Mamprin sexta-feira, 12 de setembro de 2014 13:54
    • Sugerido como Resposta RZVieira terça-feira, 16 de setembro de 2014 12:25
    • Não Sugerido como Resposta pnet terça-feira, 16 de setembro de 2014 14:30
    • Marcado como Resposta pnet terça-feira, 16 de setembro de 2014 14:30
    sexta-feira, 12 de setembro de 2014 13:50
  • Então eu faria isso na minha action,ou seja, o método que eu fiz não terá nenhum efeito, mas sim a Action, certo? A minha Model, eu tenho um arquivo .edmx com todas as entidades do BD e eu estava fazendo métodos para pegar por jquery. Eu sempre trabalhei assim, logo, nunca peguei nada na View, mas na jquery e ela enviava para a view, com injeção de HTML. Como não está funcionando corretamente, pensei em fazer diretamente na view, pois o que eu preciso é montar uns checkboxes para cada nó, ou seja, cada determinado campo que vem da minha consulta. Eu sempre tive dúvida nessa questão de includes de Model na view. Mas é isso mesmo que quero. Acho que eu terei que criar uma classe POCO certo, com os campos da minha consulta e atribuir a essa classe o resultado da consulta e aí sim, pegar ma view essa classe(Model).


    • Editado pnet sexta-feira, 12 de setembro de 2014 14:03
    sexta-feira, 12 de setembro de 2014 13:57
  • No meu ponto de vista depende das propriedades que voce terá nesse objeto, senão pode usar uma lista de KeyValuePair ou algo do tipo. E assim trafegaria por ViewData sem problemas.
    sexta-feira, 12 de setembro de 2014 14:38
  • Então eu faria isso na minha action,ou seja, o método que eu fiz não terá nenhum efeito, mas sim a Action, certo? A minha Model, eu tenho um arquivo .edmx com todas as entidades do BD e eu estava fazendo métodos para pegar por jquery. Eu sempre trabalhei assim, logo, nunca peguei nada na View, mas na jquery e ela enviava para a view, com injeção de HTML. Como não está funcionando corretamente, pensei em fazer diretamente na view, pois o que eu preciso é montar uns checkboxes para cada nó, ou seja, cada determinado campo que vem da minha consulta. Eu sempre tive dúvida nessa questão de includes de Model na view. Mas é isso mesmo que quero. Acho que eu terei que criar uma classe POCO certo, com os campos da minha consulta e atribuir a essa classe o resultado da consulta e aí sim, pegar ma view essa classe(Model).


    Eu nunca utilizo nas minhas Views a classe gerada pelo EF, mas sim, crio outras classes com as mesmas propriedades mas nomes diferentes, e utilizo elas como Model. 

    É bem o que você disse, crie uma classe e utilize essa classe como sua Model. 

    E a ideia do foreach é basicamente o que te respondi. 

    sexta-feira, 12 de setembro de 2014 17:35
  • Ok, vou testar hoje e posto o resultado ou as dúvidas.
    segunda-feira, 15 de setembro de 2014 10:55
  • Resolvi assim:

    div id='jqxWidget'>
        <div style='float: left; width:auto;'>
            <div id='jqxTree' style='visibility: hidden; float: left; margin-left: 20px;'>

                <ul>
                    @foreach (var item in Model)
                    {

                        <li item-checked='false' item-expanded='false'>
                            @item.Motivo
                        </li>

                    }
                </ul>
            </div>

            <div style='margin-left: 60px; float: left;'>
                <div style='margin-top: 10px;'>
                    <input id='jqxCheckBox' type="hidden">
                </div>
            </div>

        </div>
    </div>

    terça-feira, 16 de setembro de 2014 12:16