好的......我一直在这个墙上撞墙几个小时。什么似乎是一个简单的修复,我无法想出一个合适的解决方案。这是一个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)
有人可以告诉我如何解决这个问题吗?
答案 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>