Raul_Mateia_da_Silva Ответов: 3

Как устранить ошибку: "оператор foreach не может работать с переменной типа 'produto', поскольку 'produto' не содержит определения общедоступного экземпляра getenumerator


мое предплечье в поле зрения:
@foreach (var item in Model)
               {
               <tr>
                   <td>
                       @Html.DisplayFor(modelItem => item.ProdutoId)
                   </td>
                   <td>
                       @Html.DisplayFor(modelItem => item.Nome)
                   </td>
                   <td>
                       @Html.DisplayFor(modelItem => item.Categoria.Nome)
                   </td>
                   <td>
                       @Html.DisplayFor(modelItem => item.Fabricante.Nome)
                   </td>
                   <td>
                       @Html.ActionLink("Alterar Produto", "Edit", new { id = item.ProdutoId }) |
                       @Html.ActionLink("Detalhe Fabricante", "Details", new { id = item.ProdutoId }) |
                       @Html.ActionLink("Apagar Fabricante", "Delete", new { id = item.ProdutoId })
                   </td>
               </tr>
               }


Что я уже пробовал:

мой класс "Produto" в моделях:
public class Produto
{
    public long? ProdutoId { get; set; }
    public string Nome { get; set; }

    public long? FabricanteId { get; set; }
    public long? CategoriaId { get; set; }

    public Fabricante Fabricante { get; set; }
    public Categoria Categoria { get; set; }
}

DerekT-P

Вы не даете нам все соответствующие коды. Но в первом фрагменте вы перебираете элементы внутри чего-то, что называется "моделью". Во втором фрагменте, на который вы ссылаетесь-класс "модель𝘀". Я предполагаю, что вы заполнили коллекцию под названием "модели", создав отдельные экземпляры Produto под названием "Модель" и добавив их в коллекцию. Исправьте опечатку, чтобы перебирать коллекцию "Model𝘀" вместо одного экземпляра "Model", и вы должны быть в порядке.

3 Ответов

Рейтинг:
2

Raul_Mateia_da_Silva

hello thank you very much for your help.
I find the cause of the problem, when binding between the model and the View I didn't define the enumerable interface


Рейтинг:
2

Dave Kreskowiak

ОК. Ошибка означает, что вы пытаетесь выполнить итерацию по одному экземпляру класса вместо набора объектов.

Проблема заключается не в коде, который вы разместили, а в коде контроллера, который возвращает представление. Ваш код контроллера предоставляет в представление один экземпляр "Produto" вместо набора объектов "Produto".


Raul_Mateia_da_Silva

выглядит мой контроллер:

публичный класс ProdutosController : контроллер
{
частный контекст EFContext = новый контекст EFContext();

// Вам: продукция
индекс общественного ActionResult ()
{
return View(контекст.Продукция.OrderBy(c=>c.Nome));
}
}

Dave Kreskowiak

Да, вы возвращаете один объект, который является IQueryable. Это запрос, который был собран, но еще не выполнен.

В конце этого запроса вызовите функцию ToList (). Что вернет Илисту<produto>. Кроме того, разверните свои составные утверждения. Поместите результат запроса в переменную, а затем передайте эту переменную объекту представления. Это делает ваш код гораздо более отладочным, давая вам возможность увидеть результат в отладчике до того, как он будет возвращен в представление.

public class ProdutosController : Controller
{
    // GET: Produtos
    public ActionResult Index()
    {
        using (var content = new EFContext())
        {
            var queryResult = context.Produtos.OrderBy(c => c.Nome).ToList();
            return View(queryResult);
        }
    }
}

Да, и ваша реализация объекта контекста всего класса ошибочна. Контекст не утилизируется сразу же, когда он больше не используется. Вы открываете свое соединение с базой данных как можно позже и закрываете/удаляете его, когда ваш запрос будет выполнен как можно скорее. Это ограничивает использование ресурсов и лицензий на SQL server.

Рейтинг:
0

OriginalGriff

Прочтите сообщение об ошибке, это довольно ясно:

foreach statement cannot operate on variable of type 'produto' because 'produto' das not contain a public instance definition of getenumerator

Включите интерфейс IEnumerable в определение класса и реализуйте необходимый метод (GetEnumerator) IEnumerable Interface (System.Коллекции) | Майкрософт Документы[^]

Только если он поддерживает IEnumerable класс может быть использован в качестве коллекции для foreach<code> loops