none
Como eu faço um foreach em cima de uma ViewData na View. RRS feed

  • Pergunta

  • Esse é meu Controller:

    public ActionResult Acao()
            {
                RupturaEntities db = new RupturaEntities();

                var _listaUnidade  = Enumerable.Empty<object>();
                var _listaFamilia  = Enumerable.Empty<object>();
                var _listaProduto  = Enumerable.Empty<object>();
                var _listaCnpjDesc = Enumerable.Empty<object>();

                var monta_arvore = db.Ruptura
                                   .Where(m => m.IDMotivo != 7)

                                   .Select(rup => new MontaArvoreAcao
                                   {
                                       IDRuptura = rup.IDRuptura,
                                       DataRuptura = rup.DataRuptura,
                                       IDMotivo = rup.IDMotivo,
                                       Motivo = rup.Motivo.Motivo1,
                                       IDOrigem = rup.IDOrigem,
                                       CodigoPDV = rup.CodigoPDV,
                                       UF = rup.PDV.UF,
                                       Cidade = rup.PDV.Cidade,
                                       CnpjDescricao = rup.PDV.Cnpj + " - " + rup.PDV.Descricao,
                                       Codigo_Apresentacao = rup.Codigo_Apresentacao,
                                       Unidade_Negocio = rup.Apresentacao.Unidade_Negocio,
                                       Codigo_Unidade_Negocio = rup.Apresentacao.Codigo_Unidade_Negocio,
                                       Franquia = rup.Apresentacao.Franquia,
                                       Familia = rup.Apresentacao.Familia,
                                       Descricao = rup.Apresentacao.Descricao

                                   }).ToList().OrderBy(r => r.IDMotivo);

                foreach (var _idmotivo in monta_arvore)
                {
                    _listaUnidade = db.Apresentacao
                                    .Where(un => un.Codigo_Unidade_Negocio == _idmotivo.Codigo_Unidade_Negocio)
                                    .Select(u => new MontaArvoreAcao
                                    {
                                        Unidade_Negocio = u.Unidade_Negocio,
                                        Codigo_Familia = u.Codigo_Familia
                                    }).ToList().OrderBy(o => o.Unidade_Negocio);
                }

                ViewData["ListaUn"] = _listaUnidade.ToList();

                foreach(var _idUn in monta_arvore)
                {
                    _listaFamilia = db.Apresentacao
                                    .Where(f => f.Codigo_Familia == _idUn.Codigo_Familia)
                                    .Select(f => new MontaArvoreAcao
                                    { 
                                        Familia = f.Familia,
                                        Codigo_Familia = f.Codigo_Familia
                                    }).ToList();
                }

                ViewData["ListaFam"] = _listaFamilia;

                foreach(var _prod in monta_arvore)
                {
                    _listaProduto = db.Apresentacao
                                    .Where(p => p.Codigo_Apresentacao == _prod.Codigo_Apresentacao)
                                    .Select(prod => new MontaArvoreAcao
                                    {
                                        Descricao = _prod.Descricao,
                                        Codigo_Apresentacao = _prod.Codigo_Apresentacao
                                    }).ToList();
                }

                ViewData["ListaProd"] = _listaProduto;

                foreach(var cnpj in monta_arvore)
                {
                    _listaCnpjDesc = db.PDV
                                     .Where(c => c.CodigoPDV == cnpj.CodigoPDV)
                                     .Select(x => new MontaArvoreAcao
                                     {
                                         CnpjDescricao = x.Cnpj + " - " + x.Descricao
                                     }).ToList();
                }

                return View(monta_arvore.ToList());
            }

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

                var resultado = (from _pdv in db.PDV
                                 .Where(c => c.UF == _uf)
                                 select new { _pdv.Cidade }).ToList().Distinct().OrderBy(o => o.Cidade);

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

    Essa é a minha View onde quero fazer o foreach

                                                                        

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

                @{
                    var _motivo = "";
                    var _un = ViewData["ListaUn"];
                    var _familia = "";
                    var _desc = "";
                    var _apr = "";

                    int _idmotivo = 0;
                    <ul>
                        @foreach (var item in Model)
                        {
                            if (_motivo != @item.Motivo)
                            {
                                _idmotivo = @item.IDMotivo;
                                <li item-checked='false' item-expanded='false'>
                                    @item.Motivo

                                    <ul>
                                        @foreach (var un in (System.Collections.Generic.List<Ruptura.Models.MontaArvoreAcao>ViewData["ListaUn"]))
                                        {
                                            <li item-checked='false' item-expanded='false'>
                                                @un.Unidade_Negocio

                                            </li>
                                        }
                                    </ul>

                                  </li>

                                }
                                _motivo = @item.Motivo;
                            }
                    </ul>
                  }

    </div>

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

        </div>
    </div>

    O que passa é que nessa linha dá erro no tipo:

    @foreach (var un in (System.Collections.Generic.List<Ruptura.Models.MontaArvoreAcao>ViewData["ListaUn"]))

    Afinal, qual o tipo que eu carrego no List?

    Eis o erro:

    Mensagem de Erro do Compilador: CS0305: O uso de tipo 'System.Collections.Generic.List<T>' genérico requer argumentos de tipo 1

    • Editado pnet segunda-feira, 22 de setembro de 2014 11:12
    segunda-feira, 22 de setembro de 2014 10:56

Respostas

  • pnet

    Faça assim:

    @foreach(var prod in (List<TipoDaLista>)ViewData["SuaViewData"])
    {
    
    }
    Abraço.
    • Marcado como Resposta pnet segunda-feira, 22 de setembro de 2014 18:18
    segunda-feira, 22 de setembro de 2014 13:09

Todas as Respostas

  • Na busca por fazer funcionar, fiz essa alteração e não deu mais nenhum erro, porém não trago mais nada na minha página, nem o Motivo que estava sendo carregado diretamente, sem ViewData ou ViewBag. Antes funcionava. O meu BD está devidamente populado, não é falta de registro. É problema mesmo. Fiz assim: Um include na página e mudança no foreach.

    meu include:

    @model IEnumerable<Ruptura.Models.MontaArvoreAcao>

    meu foreach:

    @foreach (var un in (ViewData["ListaUn"] as IEnumerable<Ruptura.Models.MontaArvoreAcao>))
    Não entra no foreach. Coloquei um break e vi que não entra, ele pula direto.
    • Editado pnet segunda-feira, 22 de setembro de 2014 12:29
    segunda-feira, 22 de setembro de 2014 12:23
  • Oi, veja se te ajuda...

    foreach (DataRowView rowView in dataView) { DataRow row = rowView.Row; // Código // }

    ou

    For Each rowView As DataRowView in dataView
        Dim row As DataRow = rowView.Row
        ' Do something '
    Next

    []'s,

    Anderson


    Se o meu conteúdo resolveu o seu problema ou sua dúvida, então marque como "Resposta" ou se foi útil marque como "útil". Pois isso ajudará outras pessoas com o mesmo problema ou dúvida.


    • Editado Alvesanderson segunda-feira, 22 de setembro de 2014 13:08 Correção
    segunda-feira, 22 de setembro de 2014 13:06
  • pnet

    Faça assim:

    @foreach(var prod in (List<TipoDaLista>)ViewData["SuaViewData"])
    {
    
    }
    Abraço.
    • Marcado como Resposta pnet segunda-feira, 22 de setembro de 2014 18:18
    segunda-feira, 22 de setembro de 2014 13:09
  • Estou com dificuldade de entender qual meu DataList, pois até então entendo ser MontaArvoreAcao, mas dessa forma dá um monte de erro. Montar uma árvore de dependência, para mim tá osso. Tenho até amanhã(prazo normal) e até agora não andei muito. Colegas, veja o meu Controller e veja se está correto mesmo daquela forma.
    segunda-feira, 22 de setembro de 2014 13:56
  • Vou fazer esse teste e ver o que acontece, mas preciso montar todos os checkbox's na minha View e até agora nada..
    segunda-feira, 22 de setembro de 2014 13:57