Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Instrução foreach não pode operar em variáveis do tipo "TModel" porque "TModel" não contém uma definição pública para "GetEnumerator"

Por alguma razão o meu código está apresentando este erro na view Produto/Index.cshtml já revisei a Controller, a View e todo código, está idêntico ao da aula.

View

@model IList<CaelumEstoque.Models.Produto>

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
    <div> 
        <table>
            <thead>
                <tr>
                    <th>
                        ID
                    </th>
                    <th>
                        Produto
                    </th>
                    <th>
                        Quantidade
                    </th>
                </tr>
            </thead>
            <tbody>
                @foreach(var produto in Model)
                {
                    <tr>
                        <td>
                            @produto.Id
                        </td>
                        <td>
                            @Html.ActionLink(produto.Nome, "Visualizar", "Produto", new { id = produto.Id })
                        </td>
                        <td>
                            @produto.Quantidade
                        </td>
                    </tr>
                }
            </tbody>
        </table>
    </div>
</body>
</html>

Controller

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using CaelumEstoque.DAO;
using CaelumEstoque.Models;

namespace CaelumEstoque.Controllers
{
    public class ProdutoController : Controller
    {

        ProdutosDAO _daoProdutos = new ProdutosDAO();
        CategoriasDAO _daCategorias = new CategoriasDAO();

        // GET: Produto
        public ActionResult Index()
        {
            IList<Produto> produtos = _daoProdutos.Lista();

            return View(produtos);
        }

        public ActionResult Form()
        {
            IList<CategoriaDoProduto> categorias = _daCategorias.Lista();

            ViewBag.Categorias = categorias;
            ViewBag.Produto = new Produto();

            return View();
        }

        [HttpPost]
        public ActionResult Adicionar(Produto newProduto)
        {
            int idDaInformatica = 1;
            string nomeNao = "zzz";

            if(newProduto.CategoriaId.Equals(idDaInformatica) && (newProduto.Nome == nomeNao))
            {
                ModelState.AddModelError("newProduto.NomeNao", "O Produto não pode ter o nome: " + nomeNao);
            }
            if (ModelState.IsValid)
            {
                _daoProdutos.Adiciona(newProduto);

                return RedirectToAction("Index", "Produto");
            }
            else
            {
                IList<CategoriaDoProduto> categorias = _daCategorias.Lista();

                ViewBag.Categorias = categorias;
                ViewBag.Produto = newProduto;

                return View("Form");
            }
        }

        public ActionResult Visualizar(int id)
        {
            Produto produto = _daoProdutos.BuscaPorId(id);

            ViewBag.Produto = produto;

            return View();
        }
    }
}
4 respostas

A propósito estou utilizando o visual studio 2017, eu só fiz o download do código na primeira aula, e fui fazendo todos exercícios nele desde então.

solução!

Olá Tiago,

Note que o seu foreach na sua View está assim:

@foreach(var produto in Model)
{
    <tr>
        <td>
            @produto.Id
        </td>
        <td>
            @Html.ActionLink(produto.Nome, "Visualizar", "Produto", new { id = produto.Id })
        </td>
        <td>
            @produto.Quantidade
        </td>
    </tr>
}

Aqui tem o problema na linha @Html.ActionLink(produto.Nome, "Visualizar", "Produto", new { id = produto.Id }) que o ActionLink precisa que seu primeiro parâmetro seja do tipo String. Como o produto foi declarado como var no foreach, o compilador não sabe qual é o tipo da variável produto, logo ele não consegue descobrir que produto.Nome é uma String. Para resolver isso, você precisa passar o tipo Produto para a variável:

@foreach(CaelumEstoque.Models.Produto produto in ViewBag.Produtos)

Veja se isso resolve o problema.

Resolvido! Obrigado

O Visual Studio aqui tbm apontou esse erro, mas foi só mandar executar que funcionou normalmente, com o codigo exatamente como esta no video

@model IList<CaelumEstoque.Models.Produto>

e

 @foreach(var produto in Model)