MVC 4中相关对象的问题

时间:2014-06-26 18:00:35

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

我设置了几个对象:

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>

我可以访问产品和产品类别,但不能访问相关对象。我错过了什么?

2 个答案:

答案 0 :(得分:1)

第一个示例中的问题是您在@前面使用category.Products。这会引起语法错误。

第二个示例中的问题是名称不恰当的ProductCategory属性实际上是集合,而不是单个对象。换句话说,您无法直接访问Name之类的属性。您还必须遍历此集合或以其他方式加入值。例如,在这种情况下,您可能只想列出产品所属的所有类别,因此您可以执行以下操作:

@string.Join(", ", product.ProductCategory.Select(m => m.Name))

创建一个枚举,其中只包含集合中每个Name的{​​{1}}值,然后将它们连接在一起,用逗号和空格描述:ProductCategory

虽然我有你,但是你应该做一些重要的改变:

  1. 由于这些是相关的事情,不要做两个单独的数据库查询(一个用于产品,一个用于类别),而是选择一个(可能是基于您的用法的产品),然后加入另一个相同的查询:

    Category1, Category2, Category3, ...
  2. 请勿使用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>