我一直在为我的项目收到此错误。
传递到字典中的模型项是类型的 'System.Collections.Generic.List
1[<>f__AnonymousType2
2 [System.String,System.String]]', 但是这个字典需要一个类型的模型项 'System.Collections.Generic.IEnumerable`1 [ETMS.Models.DB.tblParent]'。描述:执行期间发生了未处理的异常 当前的网络请求。请查看堆栈跟踪了解更多信息 有关错误的信息以及它在代码中的起源。
=============================================== ===================================
我想要做的是从数据库中检索数据(一对多),这是我的数据库表结构
tblparent
- Parent_ID
- Username
- Password
- Firstname
- Lastname
和
tblParentEmail
- ParentEmail_ID
- Email
- Parent_ID
我是从电子邮件发送到父母的外国关系,但是当有另一个错误时我无法包含EF。我这样做并给我造成了这个错误:
public ActionResult Clientlist()
{
using (ETMSPeopleEntities db = new ETMSPeopleEntities())
{
//var sxc = db.tblParents.Include("tblLocation").Include("tblParentEmails.ParentEmail_ID")
// .OrderByDescending(p => p.Status).ToList();
var members = (from x in db.tblParentEmails
join y in db.tblParents
on x.Parent_ID equals y.Parent_ID
select new { Email = x.ParentEmail, UserName = y.Username }).AsEnumerable();
return View(members.ToList());
}
}
这是我的admincontroller
@model IEnumerable<ETMS.Models.DB.tblParent>
@{
ViewBag.Title = "Clientlist";
}
<h2>Clientlist</h2>
<p>
@Html.ActionLink("Create New", "Create")
</p>
<table>
<tr>
<th>
Username
</th>
<th></th>
</tr>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.Username)
</td>
<td>
@Html.DisplayFor(modelItem => item.Firstname)
</td>
<td>
@Html.DisplayFor(modelItem => item.Lastname)
</td>
<td>
@Html.DisplayFor(modelItem => item.Location_ID)
</td>
<td>
@Html.DisplayFor(modelItem => item.Email)
</td>
<td>
@Html.DisplayFor(modelItem => item.CreateTime)
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { id=item.Parent_ID }) |
@Html.ActionLink("Details", "Details", new { id=item.Parent_ID }) |
@Html.ActionLink("Delete", "Delete", new { id=item.Parent_ID })
</td>
</tr>
}
</table>
这是客户列表视图
答案 0 :(得分:3)
您将匿名对象列表传递给您的视图:
select new { Email = x.ParentEmail, UserName = y.Username }
虽然视图期待IEnumerable<ETMS.Models.DB.tblParent>
:
@model IEnumerable<ETMS.Models.DB.tblParent>
您应该将您的选择更改为:
select y
以使代码正常工作。
以下是 可以使用视图模型模式的方式。首先,创建一个视图模型类,这样就不会将匿名类型传递给视图。我们称之为AwesomeEmailViewModel
,看起来您需要.Email
,.Username
和其他一些属性,所以我们也会设置它们。
public class AwesomeEmailViewModel
{
public string Email { get; set; }
public string Username { get; set; }
public string FirstName{ get; set; }
public string LastName { get; set; }
public int Location_ID{ get; set; }
public DateTime CreateTime { get; set; }
}
现在,通过使用对象初始化来填充AwesomeEmailViewModel
注意:我猜测哪些属性属于哪些对象(tblParent或tblParentEmails,因此您需要仔细检查这些
var members = (from x in db.tblParentEmails
join y in db.tblParents
on x.Parent_ID equals y.Parent_ID
select new AwesomeEmailViewModel()
{
Email = x.ParentEmail,
UserName = y.Username,
FirstName = y.FirstName,
LastName = y.LastName,
Location_ID = x.Location_ID,
CreateTime = y.CreateTime,
}).ToList();
// I don't know if you'll need the `AsEnumerable()` call
return View(members);
最后,您的视图必须知道期望的类型,所以让我们修改它以期望我们新创建的AwesomeEmailViewModel实例的列表。
@model IEnumerable<ETMS.Models.AwesomeEmailViewModel>
请密切关注,因为我也猜到了命名空间。无论如何,这应该可以让您访问视图中所需的属性。如果您需要更多,则需要修改我们创建的新视图模型类以及控制器操作中的查询。
答案 1 :(得分:2)
您的视图需要tblParent,但您将其传递给已连接的表。
您需要创建一个ViewModel,将表连接到那里并更改您的视图以期望ViewModel而不是tblParent。
有很多例子。这是一个:ASP.NET MVC ViewModel Pattern
我希望这会有所帮助
戴维
答案 2 :(得分:1)
在视图文件中,您需要一个IEMS.Models.DB.tblParent的IEnumerable类型的模型,并且在控制器中,您传入 members.ToList(),您必须更改一个让它匹配。
您可以像这样创建一个视图模型
public Class Client
{
public string Email {get;set;}
public string UserName {get;set;}
}
在控制器操作中返回此列表而不是匿名类型,您将在视图中定义IEnumerable Client类型。
答案 3 :(得分:0)
您从linq查询中返回匿名类型。您的视图需要一个类型为tblParent
将你的linq投射到正确的类型,它应该没问题。
一眼就看起来像
select new { Email = x.ParentEmail, UserName = y.Username })
应该是
select y
答案 4 :(得分:0)
那是因为你做了一个“选择新”,它创建了一个新的匿名类型。该视图期待tblParent。视图引擎无法将匿名类型强制转换为具体类型。要修复,请从LINQ查询返回tblParent或将模型更改为“@model dynamic”。