2011-08-14 100 views
0

好的......我一直在头撞墙上的这个墙上好几个小时。什么似乎是一个简单的事情来解决,我不能想出一个适当的解决方案。这是一个MVC 3网站。无法遍历集合

我有一个web服务,它成功地返回我的控制器中的实体框架客户对象与一条记录。它可以包含许多Customer对象,但在这种情况下,它只有一条记录。

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

当试图通过客户对象上进行迭代,我收到以下错误信息:

不能施放 “((System.Web.Mvc.WebViewPage)(本))。 ViewData.Model” (其具有实际类型 的 'YeagerTech.YeagerTechWcfService.Customer')到 'System.Collections.Generic.IEnumerable'

它obvioulsy可以不用c因为我的Customer对象是一个IEnumberable对象,我不知道为什么......在尝试浏览每个“客户”记录时,您不能将EF对象转换为IEnumerable对象吗?

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

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

可有人请让我知道我该怎么解决这个问题?

+0

编辑你的文章,你可以看到你的代码不完整。你能用完整的代码更新吗? – Mrchief

+0

和'db.GetCustomers();' – naveen

回答

0

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

我不确定为什么你想在迭代视图时,当你从控制器作为模型传递一个Customer对象。

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

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

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

+0

返回什么简单地做你的答案不是很有帮助。我将公共客户GetCustomers()中的Web服务中的方法更改为公共IEnumerable GetCustomers()。 – sagesky36

+0

我在这个方法中执行如下查询,如下所示:IEnumerable customer = null; – sagesky36

+0

IEnumerable customer = null; var customerEntity =从DbContext.Customers中的c – sagesky36

-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> 
+0

除非'YeagerTechWcfService.Customer'实现'IEnumerable ',否则它将不会编译。 – Eranga

+0

您的评论不正确... ToList将DbSet转换为IEnumerable对象。我会更详细地更新我的答案。 – oliwa

+0

请仔细看看YeagerTechWcfService.Customer custs = db.GetCustomers()。ToList();'中'='左边的内容。你可以给“客户”对象分配一个列表吗? – Eranga

0

我CNT肯定地说,因为我看不到你的代码,但我假设,如果你改变它IEmumurable应该解决这个问题

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

+0

只是做你的答案没有什么帮助。我将公共客户GetCustomers()中的Web服务中的方法更改为公共IEnumerable GetCustomers()。 – sagesky36

+0

我收到了最后一条语句上的错误,如下所示:无法强制转换'customerEntity.ToList()'(其实际类型为'System.Collections.Generic.List <<> f__AnonymousType4 sagesky36

+0

这是我得到错误的声明:customer =(IEnumerable )customerEntity.ToList(); – sagesky36

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或类型转换。他们只是涵盖类型不匹配。

+0

只是做你的答案并不完全有帮助。我将公共客户GetCustomers()中的Web服务中的方法更改为公共IEnumerable GetCustomers()。我在这个方法中执行如下查询,如下所示:IEnumerable customer = null; var customerEntity = from DbContext.Customers – sagesky36

+0

我在最后一条语句上收到错误,如下所示:无法强制转换'customerEntity.ToList()'(其实际类型为'System.Collections.Generic.List <<> f__AnonymousType4 >')to'System.Collections.Generic.IEnumerable '看起来ToList方法不会让我将它转换为Ienumerable对象。这是ToList方法的目的;能够将列表转换为Ienumerable。我该如何解决这个问题? – sagesky36

+0

这是我收到错误的声明:customer =(IEnumerable )customerEntity。ToList(); – sagesky36