我正在使用实体框架构建一个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教程,他们就是这样做的。
我希望有人能帮我解决这个问题。
答案 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
,这将会执行。