How I do a foreach inside the View in a Viewdata

Asked

Viewed 568 times

-1

Those are my Viewdata on the 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 scroll through 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>
              }

The thing is, on that line there’s a mistake in the guy:

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

After all, what kind do I carry on the List?

That 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 search to make it work, I made this change and did not give any more error, 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 BD is properly populated, it is not registration fault. It is problem even. I did so: A 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 saw that does not enter, it jumps straight.

2 answers

3

Try:

foreach(var un in (List<Unidade>)ViewData["ListaUn"])
  • So Miguel, this has been my question. What to put in the place of Unity as you put it. What kind, this is what led me to the post.

  • Where I have the Unit is where you put your type of data from the list. It will be Presentation??

  • I’ve made a few edits to show the progress I’ve been making, but I haven’t solved it yet.

2

What Cesarmiguel answered is correct, but the type for List must be the last cast you did in the controller, in this 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 this case Select() will return a Ienumerable and as you used Tolist(), will return a

List<MontaArvoreAcao>

Browser other questions tagged

You are not signed in. Login or sign up in order to post.