Не удается перебрать коллекцию - PullRequest
0 голосов
/ 14 августа 2011

ОК ... Я бился головой об стену на этом часах. То, что кажется простым делом, я не могу найти правильное решение. Это веб-сайт MVC 3.

У меня есть веб-сервис, который успешно возвращает объект Entity Framework Customer в моем контроллере с одной записью. Он может содержать много объектов Customer, но в этом случае у него всего одна запись.

YeagerTechWcfService.Customer custs = db.GetCustomers();
return View("Index", custs);

При попытке перебрать объект Customer появляется следующее сообщение об ошибке:

Невозможно сотворить '((System.Web.Mvc.WebViewPage) (это)). ViewData.Model' (который имеет фактический тип YeagerTech.YeagerTechWcfService.Customer 'System.Collections.Generic.IEnumerable'

Это не может привести мой объект Customer к объекту IEnumberable, и я не знаю почему .... Разве вы не можете привести объекты EF к объекту IEnumerable при попытке просмотреть каждую запись "Customer"?

В моем представлении у меня есть следующий код. ViewData.Model содержит данные записи клиента. @model YeagerTech.YeagerTechWcfService.Customer

@if (ViewData.Model != null)
    {
        foreach (YeagerTech.YeagerTechWcfService.Customer item in (IEnumerable<YeagerTech.YeagerTechWcfService.Customer>)ViewData.Model)

Может кто-нибудь, пожалуйста, дайте мне знать, как я могу решить эту проблему?

Ответы [ 4 ]

2 голосов
/ 14 августа 2011

У вас есть список (или перечисление) клиентов и одного клиента. Это начинается со следующей строки:

YeagerTechWcfService.Customer custs = db.GetCustomers();

В декларации слева четко указано, что это один клиент, а название метода справа указывает на то, что вы ожидаете список клиентов.

В представлении вы объявляете модель единственным клиентом:

@model YeagerTech.YeagerTechWcfService.Customer

Но тогда вы не используете строго типизированную переменную экземпляра Model, а вместо этого используете нетипизированное свойство ViewData.Model и приводите его к тому, чем оно не является (таким образом, получая ошибку).

В нынешнем виде db.GetCustomers() возвращает одного клиента (не список с одним клиентом). Поэтому удалите из представления цикл foreach и просто напишите:

@if (Model != null)
{
    <p>@Model.FirstName @Model.LastName</p>
    ...
}

Другой подход - исправить db.GetCustomers(), чтобы он действительно возвращал список клиентов. Затем вы должны изменить свой контроллер на:

List<YeagerTechWcfService.Customer> customerList = db.GetCustomers();
return View("Index", customerList );

и ваш взгляд:

@model List<YeagerTech.YeagerTechWcfService.Customer>

@if (Model != null)
{
    foreach (YeagerTech.YeagerTechWcfService.Customer item in Model)
    {
        <p>@item.FirstName @item.LastName</p>
        ....
    }
}

Нет необходимости использовать ViewData.Model или набирать тип. Они просто охватывают несоответствия типов.

0 голосов
/ 14 августа 2011

Попробуйте это ...

YeagerTechWcfService.Customer custs = db.GetCustomers () .ToList () ;

Обновление Вот код, который у меня есть на существующем веб-сайте, который возвращает перечислимый список, и я перебираю список в моем контроллере.

public List<Subscriber> GetSubscribers()
{
    using (var database = new Data.MyCoolDatabase())
     {
        return database.Subscribers.ToList();
     }
}

С вашей точки зрения, убедитесь, что ваше модельное утверждение является IEnumerable, например так ...

@model IEnumerable<Newsletter.Web.Models.Subscriber>
0 голосов
/ 14 августа 2011

Я не могу сказать наверняка, так как я не вижу ваш код, но я предполагаю, что ваше представление настроено как строго типизированное представление клиента, если вы измените его на IEmumurable, это должно решить проблему

edit: измените строку @model с Customer на IEnumerable<Customer>, и это должно исправить вашу ошибку, судя по сообщению об ошибке, которое вы установили как строго типизированное представление типа Customer, которое только позволит вам использовать Единственный клиент должен использовать IEnumerable линию модели представления, чтобы пересмотреть это, или вы получите эту ошибку навсегда, если это не исправит вашу ошибку, обновите ваш вопрос с полным источником вашего представления, чтобы мы могли видеть все

0 голосов
/ 14 августа 2011

Проблема не имеет ничего общего с EF.Вы просто не можете привести Customer объект к IEnumerable<Customer>.

Я не уверен, почему вы хотите выполнять итерацию в представлении, когда вы передаете объект Customer из контроллера в качестве Модели.

Если тип возвращаемого вами метода GetCustomers() равен YeagerTech.YeagerTechWcfService.Customer, вы можете создать список и передать его для просмотра.

var customers = new List<YeagerTech.YeagerTechWcfService.Customer>(db.GetCustomers());
return View("Index", customers);

Предлагаю вам просмотреть свой дизайн.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...