将数据从控制器传输到视图 - 列出<> / IEnumerable<&gt ;?

时间:2015-03-17 21:53:57

标签: c# asp.net-mvc entity-framework

我正在使用实体框架构建一个asp.net MVC应用程序,但它并没有按照我想要的方式工作。

这是我的模型(并非所有模型类,但这都不相关):

public class Product
{
    public Product()
    {
        Categories = new List<Category>();
    }

    public int ProductID { get; set; }

    public byte[] Image { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public decimal Price { get; set; }

    public Offer Offer { get; set; }

    public virtual ICollection<Category> Categories { get; set; }
}

public class Category
{
    public Category()
    {
        Products = new List<Product>();
    }

    public int CategoryID { get; set; }

    public byte[] Image { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }

    public virtual ICollection<Product> Products { get; set; }
}

我现在正在构建的是显示特定类别中所有产品的页面。所以,如果你去,或者说,/ Category / 1它应该显示类别1中的所有产品。目前我这样做。 在控制器中我有这个方法:

public ActionResult Category(int ID)
{
    return View(db.Categories.Where(c => c.CategoryID == ID).Include(c => c.Products));
}

应该加载该特定类别的所有产品并将该数据发送到视图:

@model IEnumerable<Webshop.Models.Product>

@{
    ViewBag.Title = "Category: " + @ViewBag.CategoryName;
}

<h2>@ViewBag.CategoryName</h2>

<table>
    <tr>
        <th>@Html.DisplayNameFor(model => model.FirstOrDefault().Name)</th>
        <th>@Html.DisplayNameFor(model => model.FirstOrDefault().Price)</th>
        <th>Details</th>
    </tr>

    @foreach (var product in Model)
    {
        <tr>
            <td>@product.Name</td>
            <td>@product.Price</td>
            <td>@Html.ActionLink("Details", "Product", new { ID = product.ProductID })</td>
        </tr>
    }
</table>

这应该有用,对吗?嗯,不是。 如果我去/ Category / 1,我会收到以下错误:

  

传递到字典中的模型项是类型的   'System.Data.Entity.Infrastructure.DbQuery 1[Webshop.Models.Category]', but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable 1 [Webshop.Models.Product]'。

在控制器中添加.ToList()不起作用。

实际上它是有道理的,但我不知道有任何其他方法可以做到这一点。更奇怪的是,我遵循了微软的asp.net教程,他们就是这样做的。

我希望有人能帮我解决这个问题。

1 个答案:

答案 0 :(得分:1)

您的视图需要IEnumerable<Webshop.Models.Product>的模型,但您的控制器方法正在返回Category个对象的集合。

我会改变你的看法:

@model Webshop.Models.Category

@{
    ViewBag.Title = "Category: " + Model.Name;
}

<h2>@ViewBag.CategoryName</h2>

<table>
    <tr>
        <th>@Html.DisplayNameFor(model => model.Products.FirstOrDefault().Name)</th>
        <th>@Html.DisplayNameFor(model => model.Products.FirstOrDefault().Price)</th>
        <th>Details</th>
    </tr>

    @foreach (var product in Model.Products)
    {
        <tr>
            <td>@product.Name</td>
            <td>@product.Price</td>
            <td>@Html.ActionLink("Details", "Product", new { ID = product.ProductID })</td>
        </tr>
    }
</table>

然后您的控制器方法变为:

public ActionResult Category(int ID)
{
    return View(db.Categories.Where(c => c.CategoryID == ID).Include(c => c.Products).FirstOrDefault());
}

您可能希望进行一些检查以确保找到类别而不是返回null类别,因为如果找不到给定的ID,这将会执行。