none
listar produtos categoria tipos em MVC 2 RRS feed

  • Pergunta

  • Bom no meu controller eu faço um join para juntar as tabelas e envio elas para minha view.

    Na view tento fazer um foreach ele até funciona, porem, eu não consigo separar os meus itens, se eu coloco para imprimir "item" ele imprime todos os campos "{ categoria = nome , marca = nome, ....}" da tabela se eu coloco "item.nometabela" ele da a seguinte mensagem de erro.

     

    Server Error in '/' Application.
    'object' does not contain a definition for 'categoria' 
    Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 
    
    Exception Details: Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 'object' does not contain a definition for 'categoria'
    
    Source Error: 
    
    Line 41:  { %>
    Line 42:  
    Line 43:  <%: item.categoria %>
    Line 44: <%--  <tr>
    Line 45:    <td>
    
    
    Source File: c:\Users\Rodrigo\Documents\Visual Studio 2010\Projects\RASProject\RASProject\Areas\Admin\Views\Produto\Index.aspx Line: 43 
    
    Stack Trace: 
    
    [RuntimeBinderException: 'object' does not contain a definition for 'categoria']
     CallSite.Target(Closure , CallSite , Object ) +170
     System.Dynamic.UpdateDelegates.UpdateAndExecute1(CallSite site, T0 arg0) +438
     ASP.areas_admin_views_produto_index_aspx.__RenderContent2(HtmlTextWriter __w, Control parameterContainer) in c:\Users\Rodrigo\Documents\Visual Studio 2010\Projects\RASProject\RASProject\Areas\Admin\Views\Produto\Index.aspx:43
     System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) +109
     System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +8
     System.Web.UI.Control.Render(HtmlTextWriter writer) +10
     System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) +27
     System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) +100
     System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +25
     ASP.areas_admin_views_shared_site_master.__Render__control1(HtmlTextWriter __w, Control parameterContainer) in c:\Users\Rodrigo\Documents\Visual Studio 2010\Projects\RASProject\RASProject\Areas\Admin\Views\Shared\Site.Master:29
     System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) +109
     System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +8
     System.Web.UI.Control.Render(HtmlTextWriter writer) +10
     System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) +27
     System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) +100
     System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +25
     System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) +208
     System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +8
     System.Web.UI.Page.Render(HtmlTextWriter writer) +29
     System.Web.Mvc.ViewPage.Render(HtmlTextWriter writer) +56
     System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) +27
     System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) +100
     System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +25
     System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3060
    
    
    Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.1

     

    View

     

     <% foreach (var item in Model)
      { %>
     
     <%: item.categoria %>

     

    Controller

     

    var lista = from produtos in ctx.produtos
          join categorias in ctx.categorias on produtos.categoria_id equals categorias.categoria_id
          join marcas in ctx.marcas on produtos.categoria_id equals marcas.marca_id
          join tipos in ctx.tipos on produtos.categoria_id equals tipos.tipo_id
          where produtos.status == "Ativo"
          select new
          {
           produtos.produto_id,
           produtos.produto,
           produtos.peso,
           produtos.preco,
           produtos.status,
           categorias.categoria,
           marcas.marca,
           tipos.tipo
          };
    
       return View(lista);
    

     minha niew não esta tipada.

    domingo, 24 de outubro de 2010 15:21

Respostas

  • Fala... Foi mal...

    O seu Model é uma lista de objetos anônimos. Você usa C# 4? Se sim, usar dynamic, retornando uma lista de ExpandoObject .

    Funciona, é legal e tudo.

    Mas eu criaria uma classe POCO para entregar esses dados para a View, e tornaria a View tipada... Essa classe seria uma View Model, no seu caso poderia ser uma classe chamada "ProdutoViewModel".

    Veja em: http://polymorphicpodcast.com/vmworkshop/

     


    Forte abraço,

    André Borges Medeiros
    MCT, MCPD, MCTS

    >> Se a resposta solucionar sua dúvida, favor Votar como Útil
    • Sugerido como Resposta Buzios terça-feira, 26 de outubro de 2010 11:09
    • Marcado como Resposta Rodrigo Spinola terça-feira, 26 de outubro de 2010 23:49
    segunda-feira, 25 de outubro de 2010 12:46
    Moderador
  • Fala Rodrigo,

    Como sua View não é tipada, você tem que fazer o Cast no Model :

    <% foreach (var item in (Produto) Model)
      { %>
     
     <%: item.categoria %>

     

     


    Forte abraço,

    André Borges Medeiros
    MCT, MCPD, MCTS

    >> Se a resposta solucionar sua dúvida, favor Votar como Útil
    • Marcado como Resposta Rodrigo Spinola terça-feira, 26 de outubro de 2010 23:48
    segunda-feira, 25 de outubro de 2010 11:30
    Moderador
  • o problema eh que meu model não é exatamente um Produto pois ele tem a categoria marca e tipos em forma de string e não inteiro justamente por isso eu não fiz ela tipada
    • Marcado como Resposta Rodrigo Spinola terça-feira, 26 de outubro de 2010 23:48
    segunda-feira, 25 de outubro de 2010 11:39
  • uso c# 4, acho que vou acabar  indo para a 1º opção que vc passou. Mais so mais anoite agora to no trampo valeu pela ajuda.
    • Marcado como Resposta Rodrigo Spinola terça-feira, 26 de outubro de 2010 23:49
    segunda-feira, 25 de outubro de 2010 13:32
  • Muito obrigado novamente nao procurei como converter anonimo para expand mais fiz desta forma. Não acho a mais correta mais foi a que pensei na hora^^. tive que add o using system.dynamic

     

    Controller

    var lista = from produtos in ctx.produtos
                join categorias in ctx.categorias on produtos.categoria_id equals categorias.categoria_id
                join marcas in ctx.marcas on produtos.categoria_id equals marcas.marca_id
                join tipos in ctx.tipos on produtos.categoria_id equals tipos.tipo_id
                where produtos.status == "Ativo"
                select new
                {
                  produtos.produto_id,
                  produtos.produto,
                  produtos.peso,
                  produtos.preco,
                  produtos.status,
                  categorias.categoria,
                  marcas.marca,
                  tipos.tipo
                };
    
    
          var items = new List<ExpandoObject>();
          
          foreach(var listaitem in lista.ToList())
          {
            dynamic item = new ExpandoObject();
            item.produto_id = listaitem.produto_id;
            item.produto = listaitem.produto;
            item.peso = listaitem.peso;
            item.preco = listaitem.preco;
            item.status = listaitem.status;
            item.categoria = listaitem.categoria;
            item.marca = listaitem.marca;
            item.tipo = listaitem.tipo;
            items.Add(item);
          }
    
          //return View(ctx.produtos.ToList());
          return View(items);
    

    View

    <%var items = Model as List<System.Dynamic.ExpandoObject>;
              foreach (dynamic item in items)
              { %>
          <tr>
          <td>
            <%: Html.ActionLink("Edit", "Edit", new { id=item }) %> |
            <%: Html.ActionLink("Details", "Details", new { id=item.produto_id })%> |
            <%: Html.ActionLink("Delete", "Delete", new { id=item.produto_id })%>
          </td>
          <td>
            <%: item.categoria %>
          </td>
          <td>
            <%: item.descricao %>
          </td>
          <td>
            <%: item.marca %>
          </td>
          <td>
            <%: String.Format("{0:F}", item.peso) %>
          </td>
          <td>
            <%: String.Format("{0:F}", item.preco) %>
          </td>
          <td>
            <%: item.produto %>
          </td>
          <td>
            <%: item.produto_id %>
          </td>
          <td>
            <%: item.tipo %>
          </td>
        </tr>
      <% } %>

     

    • Marcado como Resposta Rodrigo Spinola terça-feira, 26 de outubro de 2010 23:48
    terça-feira, 26 de outubro de 2010 23:47

Todas as Respostas

  • Fala Rodrigo,

    Como sua View não é tipada, você tem que fazer o Cast no Model :

    <% foreach (var item in (Produto) Model)
      { %>
     
     <%: item.categoria %>

     

     


    Forte abraço,

    André Borges Medeiros
    MCT, MCPD, MCTS

    >> Se a resposta solucionar sua dúvida, favor Votar como Útil
    • Marcado como Resposta Rodrigo Spinola terça-feira, 26 de outubro de 2010 23:48
    segunda-feira, 25 de outubro de 2010 11:30
    Moderador
  • o problema eh que meu model não é exatamente um Produto pois ele tem a categoria marca e tipos em forma de string e não inteiro justamente por isso eu não fiz ela tipada
    • Marcado como Resposta Rodrigo Spinola terça-feira, 26 de outubro de 2010 23:48
    segunda-feira, 25 de outubro de 2010 11:39
  • Fala... Foi mal...

    O seu Model é uma lista de objetos anônimos. Você usa C# 4? Se sim, usar dynamic, retornando uma lista de ExpandoObject .

    Funciona, é legal e tudo.

    Mas eu criaria uma classe POCO para entregar esses dados para a View, e tornaria a View tipada... Essa classe seria uma View Model, no seu caso poderia ser uma classe chamada "ProdutoViewModel".

    Veja em: http://polymorphicpodcast.com/vmworkshop/

     


    Forte abraço,

    André Borges Medeiros
    MCT, MCPD, MCTS

    >> Se a resposta solucionar sua dúvida, favor Votar como Útil
    • Sugerido como Resposta Buzios terça-feira, 26 de outubro de 2010 11:09
    • Marcado como Resposta Rodrigo Spinola terça-feira, 26 de outubro de 2010 23:49
    segunda-feira, 25 de outubro de 2010 12:46
    Moderador
  • uso c# 4, acho que vou acabar  indo para a 1º opção que vc passou. Mais so mais anoite agora to no trampo valeu pela ajuda.
    • Marcado como Resposta Rodrigo Spinola terça-feira, 26 de outubro de 2010 23:49
    segunda-feira, 25 de outubro de 2010 13:32
  • Muito obrigado novamente nao procurei como converter anonimo para expand mais fiz desta forma. Não acho a mais correta mais foi a que pensei na hora^^. tive que add o using system.dynamic

     

    Controller

    var lista = from produtos in ctx.produtos
                join categorias in ctx.categorias on produtos.categoria_id equals categorias.categoria_id
                join marcas in ctx.marcas on produtos.categoria_id equals marcas.marca_id
                join tipos in ctx.tipos on produtos.categoria_id equals tipos.tipo_id
                where produtos.status == "Ativo"
                select new
                {
                  produtos.produto_id,
                  produtos.produto,
                  produtos.peso,
                  produtos.preco,
                  produtos.status,
                  categorias.categoria,
                  marcas.marca,
                  tipos.tipo
                };
    
    
          var items = new List<ExpandoObject>();
          
          foreach(var listaitem in lista.ToList())
          {
            dynamic item = new ExpandoObject();
            item.produto_id = listaitem.produto_id;
            item.produto = listaitem.produto;
            item.peso = listaitem.peso;
            item.preco = listaitem.preco;
            item.status = listaitem.status;
            item.categoria = listaitem.categoria;
            item.marca = listaitem.marca;
            item.tipo = listaitem.tipo;
            items.Add(item);
          }
    
          //return View(ctx.produtos.ToList());
          return View(items);
    

    View

    <%var items = Model as List<System.Dynamic.ExpandoObject>;
              foreach (dynamic item in items)
              { %>
          <tr>
          <td>
            <%: Html.ActionLink("Edit", "Edit", new { id=item }) %> |
            <%: Html.ActionLink("Details", "Details", new { id=item.produto_id })%> |
            <%: Html.ActionLink("Delete", "Delete", new { id=item.produto_id })%>
          </td>
          <td>
            <%: item.categoria %>
          </td>
          <td>
            <%: item.descricao %>
          </td>
          <td>
            <%: item.marca %>
          </td>
          <td>
            <%: String.Format("{0:F}", item.peso) %>
          </td>
          <td>
            <%: String.Format("{0:F}", item.preco) %>
          </td>
          <td>
            <%: item.produto %>
          </td>
          <td>
            <%: item.produto_id %>
          </td>
          <td>
            <%: item.tipo %>
          </td>
        </tr>
      <% } %>

     

    • Marcado como Resposta Rodrigo Spinola terça-feira, 26 de outubro de 2010 23:48
    terça-feira, 26 de outubro de 2010 23:47
  • Fala, Rodrigo...

    É isso aí, velho... A idéia era essa mesma...

     


    Forte abraço,

    André Borges Medeiros
    MCT, MCPD, MCTS

    >> Se a resposta solucionar sua dúvida, favor Votar como Útil
    terça-feira, 26 de outubro de 2010 23:57
    Moderador