Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

RODRIGO RDG

Erro ao tentar passar uma lista da controller para View ASP NET MVC

Recommended Posts

Boa noite pessoal,

 

Sou novo no desenvolvimento, e estou tendo problemas em passar uma lista de uma query da controller para uma view.

Dei uma pesquisada e todas as formas que encontrei não ajudaram muito, se alguém puder me ajudar nessa ficarei grato.

 

Segue controller:

namespace DinheiroControlado.Controllers{
    public class RelatorioController : Controller
    {
        //
        // GET: /Relatorio/
        private DinheiroControladoBD db2 = new DinheiroControladoBD();
        public ActionResult Index()
        {
            
            var cookie = DinheiroControlado.Repositorios.RepositoriosUsuarios.VerificaSeOUsuarioEstaLogado();
            var dados = (from d in db2.Movimentacoes
                        join c in db2.Categorias on d.IDCategoria equals c.IDCategoria
                        where d.IDUsuario == cookie.IDUsuario
                        group d by c.Descricao into g
                        select new { Categoria = g.Key, Valor = g.Sum(d => d.Valor)}).Take(5);


            ViewBag.grafico = dados;


            return View();
        }
    }
}
Segue View:
@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Layout2.cshtml";
}


<h2>Index</h2>
<table>
    <tbody>
        @{foreach (var item in ViewBag.grafico)
            {
                <tr>
                    <td>
                        @item.Categoria
                    </td>
                    <td>
                        @item.Valor
                    </td>
                    
                </tr>
            }
        }
    </tbody>
</table>
Erro que está ocorrendo:
Erro de Servidor no Aplicativo '/'. 'object' não contém uma definição para 'Categoria' Descrição: Ocorreu uma exceção sem tratamento durante a execução da atual solicitação da Web. Examine o rastreamento de pilha para obter mais informações sobre o erro e onde foi originado no código.

Detalhes da Exceção: Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 'object' não contém uma definição para 'Categoria'

Erro de Origem:

Linha 11: <tr>
Linha 12: <td>
Linha 13: @item.Categoria
Linha 14: </td>
Linha 15: <td>
Arquivo de Origem: c:\TCC\C#\DinheiroControlado\DinheiroControlado\Views\Relatorio\Index.cshtml Linha: 13

Rastreamento de Pilha:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara o ideal é vc trabalhar com dados tipados. No seu caso cria uma classe ccom qualquer nome exemplo:

public class Retorno{
public string Categoria { get; set; }
public decimal Valor { get; set; }
}

Dai na tua action altera para:

select new Retorno { Categoria = g.Key, Valor = g.Sum(d => d.Valor)})

return View(dados.ToList());

e na tua view altera para:

@model List<Retorno>
@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Layout2.cshtml";
}


@{foreach (var item in Model){
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por MarKteus
      Olá

      Alguém sabe como posso corrigir este erro ?

      Additional information: There is no ViewData item of type 'IEnumerable<SelectListItem>' that has the key
       
       
      Acontece quando tento persistir dados na tabela

      Trecho da VIEW
      <div class="editor-label">
      @Html.LabelFor(model => model.estado)
      </div>
      <div class="editor-field">
      @Html.DropDownListFor(model => model.estado, (List<SelectListItem>)ViewBag.UF, "UF")
      </div>


      Trecho da Action

      var siglasEstaduais = uf.uf();
      var siglasItens = new List<SelectListItem>();
       
      foreach (var item in siglasEstaduais)
      {
      siglasItens.Add(new SelectListItem
      {
      Value = item.Estado,
      Text = item.Estado
      });
      }
       
      ViewBag.UF = siglasItens;
       
      Trecho do Modelo de Entidade (O modelo criei só para poder obter dados para gerar a lista, nunca existirá fisicamente no banco)

      public class estados {
       
      public int? Id { get; set; }
       
      public string Estado { get; set; }
       
       
      public IEnumerable<estados> uf()
      {
       
      estados uf = new estados();
      List<estados> estado = new List<estados>();
       
      estado.Add(new estados { Id=1,Estado="AC"});
       
      estado.Add(new estados { Id = 2, Estado = "AL" });
       
       
    • Por MarKteus
      Olá
       
       
      Pessoal to com um problema bastante chato, eu até consegui fazer o @Html.EditorFor exibir corretamente uma data no formato dd/MM/yyyy porém, feito isso meu javascript não consegue mais subtrair o ano corrente do ano de nascimento para que se obtenha a idade

      Somente a data ficando no modo padrão YYYY/mm/dd é que esse calculo é feito corretamente, alguém sabe como posso resolver
    • Por WellingtonSilva
      Boa noite meus amigos,
       
      Estou com um grande problema, até por ser um inexperiente com c#.
       
      Tenho um projeto dentro do WebMatrix, onde eu criei minha conexão com um banco padrão, que possui todas as diretivas da minha aplicação (Banco_ADM), portanto dentro do meu arquivo WebConfig, esta conexão esta lá e funciona perfeitamente, eu consigo executar todas as operações que preciso através do:
       
      Database.Open("Banco_ADM");
       
      O problema é existem outros 'n' bancos aos quais eu preciso me conectar, só que os nomes destes banco eu só tenho quando o cliente se loga no banco principal (Banco_ADM), é aqui que a coisa pega, eu tenho todos os dados para conexão, Nome do banco, Usuário e Senha, é claro o código IP ao qual tenho que me conectar no cloud. Já tentei dezenas de strings que encontrei na internet em livros, mas nenhuma conecta no outro banco, aparecem erros diversos, basta trocar alguma coisa na string que o erro muda.
       
      Por exemplo:
       
      revConecta = ("Data Source=111.11.111.11; Database=banco2; User ID=sal; Password=1234");
       
      Aqui ele me diz que o termo Data Source não condiz.
       
      Só para constar, eu já coloquei e tirei a porta 1433 em todas as minhas tentativas.
       
      Alguém já conseguiu fazer isso?
       
      Obrigado
    • Por MarKteus
      O que eu pretendo é simples: Quando a página voltar do post exibir uma mensagem via JS
      Abaixo coloquei como foi feita a função e depois mais abaixo como estou chamando a função, note que não quero chamar após click ou após mouseover etc, quero chamar quando voltar do Post, mas a linha que destaquei em vermelho é simplesmente ignorada. Alguém pode me dar uma luz?
      Função JS
      <script type="text/javascript"> function mostraMsg(msg) { alert(msg); } </script>  
      Trecho HtmlRazor
      @{
      if (IsPost) { if (@ViewBag.StatusContato != null) { <script>mostraMsg("pague antecipado e ganhe descontos");</script> @ViewBag.StatusContato } } }



      Att.
    • Por abinalio
      Boa Tarde,
      Estou desenvolvendo uma aplicação web - asp.net mvc 4 razor, na qual preciso fazer:
      1 - upload de 1 ou várias imagens;
      2 - Grava no bd (id, descrição, referencia, nome da imagem e internet)
      3 - Após o upload, apresentar estas imagens e editar os seguintes campos (descrição e internet);
      4 - Gravar as alterações no bd.
      na minha aplicação atual consegui fazer até o item 3 - não estou conseguindo pegar o model editado para gravar
      alguém pode me ajudar??
      Home Controller:
      using System;
      using System.Collections;
      using System.Collections.Generic;
      using System.IO;
      using System.Linq;
      using System.Web;
      using System.Web.Mvc;
      using UpLoad.Models;

      namespace UpLoad.Controllers
      {
      public class HomeController : Controller
      {
      //
      // GET: /Home/

      public ActionResult Index()
      {
      var imagens = new List<Imagem>();
      var path = "";
      var i = 0;
      var referencia = 100;
      var temObjeto = new Imagem()
      {
      id = i,
      referencia = referencia,
      caminho = path
      };
      imagens.Add(temObjeto);
      return View(imagens);
      }
      [HttpPost]
      public ActionResult Index(Picture picture, string salvarFotos, FormCollection form)
      {
      //string query = form["txtBusca"];
      if (!string.IsNullOrEmpty(salvarFotos))
      {

      ViewBag.Title = "Atualiza Fotos";
      }

      var imagens = new List<Imagem>();
      var i = 0;
      var descricao = "Descrição ";
      var referencia = 100;
      foreach (var file in picture.Files)
      {
      i++;
      if (file.ContentLength > 0)
      {
      var fileName = Path.GetFileName(file.FileName);
      var path = Path.Combine(Server.MapPath("~/Content/images"), fileName);
      file.SaveAs(path);
      var temObjeto = new Imagem()
      {
      id = i,
      referencia = referencia,
      descricao = descricao,
      caminho = fileName
      };
      imagens.Add(temObjeto);
      }
      }

      //return RedirectToAction("Index");
      return View(imagens);
      }
      [HttpPost]
      public ActionResult Salvar(Imagem image)
      {
      if (ModelState.IsValid)
      {

      //ViewBag.Title = "Atualiza Fotos" + image.caminho;
      }

      return View(image);
      }

      }
      }
      Classe Imagem:
      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Web;

      namespace UpLoad.Models
      {
      public class Imagem
      {
      public int id { get; set; }
      public int referencia { get; set; }
      public string descricao { get; set; }
      public string caminho { get; set; }
      }
      }
      Classe Picture:
      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Web;

      namespace UpLoad.Models
      {
      public class Picture
      {
      public IEnumerable<HttpPostedFileBase> Files {get; set; }
      }
      }

      View:
      @model IEnumerable<UpLoad.Models.Imagem>
      @{
      ViewBag.Title = "Index";
      var salvarFotos = "SIM";
      @*<h1><img src="~/Content/images/119.JPG" /></h1>*@
      }

      <h2>Up Load File</h2>
      @using (Html.BeginForm(null, null, new {model = Model}, FormMethod.Post))
      {
      <fieldset>
      <legend>Imagens</legend>
      @foreach (var item in Model)
      {
      <h1>
      @Html.EditorFor(a => item.caminho)
      @Html.EditorFor(a => item.descricao)

      <img src="~/Content/images/@item.caminho" alt="@item.caminho" height="82" width="82" />
      </h1>
      }
      <p>
      <input type="submit" value="Salvar" />
      </p>
      </fieldset>
      }
      @using (Html.BeginForm(null, null, FormMethod.Post, new { enctype = "multipart/form-data" }))
      {
      <table>
      <tr>
      <td>File:</td>
      <td>
      <input type="file" name="Files" id="Files" multiple /></td>
      </tr>
      <tr>
      <td>&npsp</td>
      <td>
      <input type="submit" name="submit" value="UpLoad" /></td>
      </tr>
      </table>
      }
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.