无法遍历集合

时间:2011-08-14 02:41:41

标签: asp.net-mvc-3 entity-framework-4.1

好的......我一直在这个墙上撞墙几个小时。什么似乎是一个简单的修复,我无法想出一个合适的解决方案。这是一个MVC 3网站。

我有一个Web服务,它在我的Controller中成功返回一个记录的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对象,我不知道为什么......在尝试浏览每个“Customer”记录时,是否不能将EF对象强制转换为IEnumerable对象?

在我的视图中,我有以下代码。 ViewData.Model中包含Customer记录的数据。 @model YeagerTech.YeagerTechWcfService.Customer

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

有人可以告诉我如何解决这个问题吗?

4 个答案:

答案 0 :(得分:2)

您混淆了列表(或可枚举的)客户和单个客户。它从以下行开始:

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或输入。它们只是涵盖了类型不匹配。

答案 1 :(得分:0)

这个问题与EF无关。您根本无法将Customer对象转换为IEnumerable<Customer>

当您从控制器传递Customer对象作为模型时,我不确定为什么要在视图中进行迭代。

如果您的GetCustomers()方法的返回类型为YeagerTech.YeagerTechWcfService.Customer,那么您可以创建一个列表并将其传递给查看。

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

我建议你检查一下你的设计。

答案 2 :(得分:0)

我肯定说,因为我无法看到你的代码,但我假设你的视图被设置为一个强类型的客户视图,如果你把它改成IEmumurable它应该解决问题

编辑:将@model行从Customer更改为IEnumerable<Customer>这应该可以修复您的错误,从您将其设置为类型为Customer的强类型视图的错误消息判断,该视图仅允许您使用单一客户使用IEnumerable视图模型行需要重新定义以解决此问题,否则您将永远收到此错误,如果这不能解决您的错误,请使用您的完整视图来更新您的问题所以我们可以看到一切

答案 3 :(得分:-1)

试试这个......

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>