ASP / MVC3 Razor Linq

时间:2011-08-05 12:43:14

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

我一直在为我的项目收到此错误。

  

传递到字典中的模型项是类型的   '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>

这是客户列表视图

5 个答案:

答案 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”。