How do I make a foreach within the View in a ViewData

-1

These are my ViewData in 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;

            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());
        }

As I do now in my View the foreac to traverse it and fill my page. Below my View.

@{
                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 ViewData["ListaUn"])
                                    {
                                        <li item-checked='false' item-expanded='false'>
                                            @item.Unidade_Negocio

                                        </li>
                                        @*}*@
                                    }
                                </ul>
                              </li>

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

What happens is that this line gives the type error:

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

After all, what type do I load in the List?

Here is the error:

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

In the quest to make it work, I made this change and did not make any more mistakes, but I do not bring anything else on my page, nor the Reason that was being loaded directly, without ViewData or ViewBag. It used to work. My DB is properly populated, not a lack of registration. It's really a problem. I did so: An include in the page and change in foreach.

My include:

@model IEnumerable<Ruptura.Models.MontaArvoreAcao>

My foreach:

@foreach (var un in (ViewData["ListaUn"] as IEnumerable<Ruptura.Models.MontaArvoreAcao>))

Do not enter the foreach. I put a break and I saw that it does not enter, it jumps straight.

    
asked by anonymous 19.09.2014 / 15:57

2 answers

3

Try:

foreach(var un in (List<Unidade>)ViewData["ListaUn"])
    
19.09.2014 / 16:02
2

What CesarMiguel answered is correct, but the type for the List should be the last cast you made in the controller, in the case MontaArvoreAcao

    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;

Whenever you use Select () in Linq, it will be the type used that your query will return. In that case Select () will return an IEnumerable and as you used ToList (), it will return a

List<MontaArvoreAcao>
    
19.09.2014 / 17:51