传递到字典中的模型项的类型为&System; Collection.Collections.Generic.List',但需要' System.Collections.Generic.IEnumerable

时间:2015-01-11 20:26:53

标签: asp.net-mvc entity-framework asp.net-mvc-4 generics

我在网上看了很多这个错误的例子。但我不知道应用它们。我正在使用EF 6.1.2和Visual Studio 2012.一切都在一个解决方案中。我为实体模型尝试了一个单独的类库,但它没有用。所以我认为我会简化一些事情,但它仍然无效。

如果您还有其他需要,请告诉我。谢谢!

这是我的控制器文件:为了安全起见,我在文件中添加了所有内容。第一个动作方法是我唯一使用的方法。

CustomerController.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using ClaimsManagement2.Models;

namespace ClaimsManagement2.Controllers
{
    public class CustomerController : Controller
    {
        //
        // GET: /Customer/
        public ActionResult Index()
        {
        ClaimsManagementContext customerContext = new ClaimsManagementContext()  
        IEnumerable<Customer> customer = customerContext.Customers.ToList();

        return View(customer);
    }

    //
    // GET: /Customer/Details/5

    public ActionResult Details(int id)
    {
        return View();
    }

    //
    // GET: /Customer/Create

    public ActionResult Create()
    {
        return View();
    }

    //
    // POST: /Customer/Create

    [HttpPost]
    public ActionResult Create(FormCollection collection)
    {
        try
        {
            // TODO: Add insert logic here

            return RedirectToAction("Index");
        }
        catch
        {
            return View();
        }
    }

    //
    // GET: /Customer/Edit/5

    public ActionResult Edit(int id)
    {
        return View();
    }

    //
    // POST: /Customer/Edit/5

    [HttpPost]
    public ActionResult Edit(int id, FormCollection collection)
    {
        try
        {
            // TODO: Add update logic here

            return RedirectToAction("Index");
        }
        catch
        {
            return View();
        }
    }

    //
    // GET: /Customer/Delete/5

    public ActionResult Delete(int id)
    {
        return View();
    }

    //
    // POST: /Customer/Delete/5

    [HttpPost]
    public ActionResult Delete(int id, FormCollection collection)
    {
        try
        {
            // TODO: Add delete logic here

            return RedirectToAction("Index");
        }
        catch
        {
            return View();
        }
        }
    }
}

Index.cshtml文件

@model IEnumerable<ClaimsManagement2.Models.Customer.>

@{
    ViewBag.Title = "Index";
 }

<h2>Index</h2>

<p>
     @Html.ActionLink("Create New", "Create")
 </p>
 <table>
 <tr>
    <th>
        @Html.DisplayNameFor(model => model.FirstName)
    </th>
    <th>
        @Html.DisplayNameFor(model => model.LastName)
    </th>
    <th>
        @Html.DisplayNameFor(model => model.AgentID)
    </th>
    <th>
        @Html.DisplayNameFor(model => model.Email)
    </th>
    <th></th>
 </tr>

 @foreach (var item in Model) {
  <tr>
    <td>
        @Html.DisplayFor(modelItem => item.FirstName)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.LastName)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.AgentID)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.Email)
    </td>
    <td>
        @Html.ActionLink("Edit", "Edit", new { id=item.CustomerID }) |
        @Html.ActionLink("Details", "Details", new { id=item.CustomerID }) |
        @Html.ActionLink("Delete", "Delete", new { id=item.CustomerID })
    </td>
  </tr>
}

 </table>

ClaimsManagementContext.cs

using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Web;

namespace ClaimsManagement2.Models
{
    public class ClaimsManagementContext : DbContext
    {
        public DbSet<Customer> Customers { get; set; }
    }
}

Customer.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations.Schema;

namespace ClaimsManagement2.Models
{
    [Table("Customers")]
    public class Customer
    {
        public int CustomerID { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public int AgentID { get; set; }
        public string Email { get; set; }
    }
}

除了给你一个数据库本身的脚本之外,我想不出别的什么可以给你。

3 个答案:

答案 0 :(得分:0)

只需让您的观看时间为List而不是Enumerable,或者在控制器中调用AsEnumerable。您可以在控制器中执行以下操作:

IEnumerable<Customer> customer = customerContext.Customers.AsEnumerable();

或者在你看来:

@model IList<ClaimsManagement2.Models.Customer>

答案 1 :(得分:0)

如果您只是循环浏览视图中的数据(因为它看起来像你)并且没有添加或希望操纵该集合,那么只需通过调用.AsEnumerable()而不是{来将您的集合转换为可枚举的数据集控制器中的{1}},如下所示:

ToList()

IEnumerable<Customer> customer = customerContext.Customers.AsEnumerable(); 接口实现了操作集合的其他方法,并且始终建议仅实现您需要的功能。

答案 2 :(得分:0)

我在网上跟踪了一些不好的指示,我创建了一个我不需要的Context类和Customer类。这给我带来了麻烦。不幸的是,当您关注YouTube视频时会发生这种情况。我需要的只是实体框架创建的类。我也不需要将我的上下文实例化放在action方法中。

需要删除Customer.cs和ClaimsManagementContext.cs。这些是由我而不是EF创造的。我现在确定何时或为什么要这样做。但现在我知道我不必这么做。