我设置了几个对象:
Product.cs
namespace Print_Solutions.Models
{
public class Product
{
public int ID { get; set; }
public string Manufacturer { get; set; }
public string Model { get; set; }
public string PartNumber { get; set; }
public int ProductCategoryID { get; set; }
public virtual ICollection<ProductCategory> ProductCategory { get; set; }
}
}
ProductCategory.cs
namespace Print_Solutions.Models
{
public class ProductCategory
{
public int ID { get; set; }
public string Name { get; set; }
public virtual ICollection<Product> Products { get; set; }
}
}
数据库上下文
namespace Print_Solutions.DAL
{
public class ApplicationContext : DbContext
{
public ApplicationContext() : base("DefaultConnection")
{
}
public DbSet<ProductCategory> ProductCategories { get; set; }
public DbSet<Product> Products { get; set; }
public DbSet<ProductDetail> ProductDetails { get; set; }
public DbSet<ProductDocument> ProductDocuments { get; set; }
public DbSet<ProductImage> ProductImages { get; set; }
public DbSet<RelatedProduct> RelatedProducts { get; set; }
}
}
控制器
namespace Print_Solutions.Controllers
{
public class DashboardController : Controller
{
private ApplicationContext db = new ApplicationContext();
public ActionResult Index()
{
ViewBag.Products = db.Products.ToList();
ViewBag.ProductCategories = db.ProductCategories.ToList();
return View();
}
}
}
问题
我在视图中尝试过几件事。这些似乎都不起作用。如何从productcategories访问产品,反之亦然?
<ul>
@foreach(Print_Solutions.Models.ProductCategory category in @ViewBag.ProductCategories)
{
<li>@category.Name
<ul>
@foreach(var product in @category.Products)
{
<li>@product.Name</li>
}
</ul>
</li>
}
</ul>
或
<ul>
@foreach (Print_Solutions.Models.Product product in @ViewBag.Products)
{
<li>@product.Name - @product.ProductCategory.Name</li>
}
</ul>
我可以访问产品和产品类别,但不能访问相关对象。我错过了什么?
答案 0 :(得分:1)
第一个示例中的问题是您在@
前面使用category.Products
。这会引起语法错误。
第二个示例中的问题是名称不恰当的ProductCategory
属性实际上是集合,而不是单个对象。换句话说,您无法直接访问Name
之类的属性。您还必须遍历此集合或以其他方式加入值。例如,在这种情况下,您可能只想列出产品所属的所有类别,因此您可以执行以下操作:
@string.Join(", ", product.ProductCategory.Select(m => m.Name))
创建一个枚举,其中只包含集合中每个Name
的{{1}}值,然后将它们连接在一起,用逗号和空格描述:ProductCategory
。
虽然我有你,但是你应该做一些重要的改变:
由于这些是相关的事情,不要做两个单独的数据库查询(一个用于产品,一个用于类别),而是选择一个(可能是基于您的用法的产品),然后加入另一个相同的查询:
Category1, Category2, Category3, ...
请勿使用var products = db.Products.Include("ProductCategory").ToList();
。像往常一样。有时候它的使用可能不会那么糟糕,但是在你能够正确区分好用法和坏用法之前,最好只是暂停一下整个概念。 ViewBag
的问题在于它使用动态;换句话说,在编译时它不会在 at 进行评估,并且在运行时中工作或失败。软件开发的黄金法则是在编译时始终失败。您想知道何时构建某些东西不起作用,而不是在它开发后的几天,几周,几个月甚至几年内部署到您的用户时。所以,是的,ViewBag
是邪恶的。相反,请使用强类型视图并将“模型”(在本例中为ViewBag
)传递给它:
<强>控制器强>
products
查看强>
var products = db.Products.Include("ProductCategory").ToList();
return View(products);
答案 1 :(得分:0)
由于产品类别是一个集合,您可能希望通过产品循环中的ProductCategory列表(在产品对象内)循环打印它们。
或者,您可以创建仅包含所需内容的视图模型。 (产品名称,ProductCategoryNames列表)并将其传递给事物。
如果您打算回复帖子,可以将ProductID添加到此视图模型(或类似ID)以及将它们放入@ Html.HiddenFor()中,以便您可以在以后根据需要引用它们。 / p>