以下是ASP.NET MVC获取多级类别组合下的产品的完整攻略:
步骤
获取多级类别组合下的产品的步骤包括以下几个步骤:
- 创建模型类。
- 创建DbContext类。
- 创建控制器和视图。
- 在控制器中编写代码以获取多级类别组合下的产品。
以下是两个示例演示如何获取多级类别组合下的产品:
示例1
- 创建模型类。
在“Models”文件夹中,创建一个名为“Product”的新类,并添加以下:
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
public int CategoryId { get; set; }
public virtual Category Category { get; set; }
}
public class Category
{
public int Id { get; set; }
public string Name { get; set; }
public int? ParentCategoryId { get; set; }
public virtual Category ParentCategory { get; set; }
public virtual ICollection<Category> ChildCategories { get; set; }
public virtual ICollection<Product> Products { get; set; }
}
在上面的代码中,我们定义了一个名为“Product”的模型类和一个名为“Category”的模型类。Product类具有CategoryId属性和Category导航属性,而Category类具有ParentCategoryId属性、ParentCategory导航属性、ChildCategories导航属性和Products导航属性。
- 创建DbContext类。
在“Models”文件夹中,创建一个名为“AppDbContext”的新类,并添加以下代码:
public class AppDbContext : DbContext
{
public DbSet<Product> Products { get; set; }
public DbSet<Category> Categories { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Category>()
.HasOptional(c => c.ParentCategory)
.WithMany(c => c.ChildCategories)
.HasForeignKey(c => c.ParentCategoryId);
}
}
在上面的代码中,我们定义了一个名为“AppDbContext”的DbContext类,并添加了一个名为“Products”的DbSet属性和一个名为“Categories”的DbSet属性我们还在OnModelCreating方法中定义了Category类的外键关系。
- 创建控制器和视图。
在“Controllers”文件夹中,创建一个名为“ProductController”的控制器,并添加以下代码:
public class ProductController : Controller
{
private readonly AppDbContext _dbContext;
public ProductController()
{
_dbContext = new AppDbContext();
}
public ActionResult Index(int? categoryId)
{
var category = _dbContext.Categories.Find(categoryId);
var products = category == null ? _dbContext.Products.ToList() : category.Products.ToList();
return View(products);
}
}
在上面的代码中,我们创建了一个名为“ProductController”的控制器,并在构造函数中实例化了一个名为“_dbContextAppDbContext对象。我们还创建了一个名为“Index”的操作方法,该方法接受一个可空的categoryId参数,并使用该参数从数据库中检索产品。
在“Views\Product”文件夹中,创建一个名为“Index.cshtml”的新视图,并添加以下代码:
model<Product>
<table>
<thead>
<tr>
<th>Id</th>
<th>Name</th>
<th>Price</th>
</tr>
</thead>
<tbody>
@foreach (var product in Model)
{
<tr>
<td>@product.Id</td>
<td>@product.Name</td>
<td>@product.Price</td>
</tr>
}
</tbody>
</table>
在上面的代码中,我们使用Razor语法创建了一个HTML表格,并使用C#代码从模型中检索产品列表。
- 在控制器中编写代码以获取多级类别组合下的产品。
在“ProductController”控制器中,我们可以使用以下代码获取多级类别组合下的产品:
public ActionResult Index(int? categoryId)
{
var category = _dbContext.Categories.Find(categoryId);
var products = category == null ? _dbContext.Products.ToList() : category.Products.ToList();
if (category != null)
{
var childCategories = category.ChildCategories.ToList();
while (childCategories.Any())
{
var childCategoryIds = childCategories.Select(c => c.Id);
products.AddRange(_dbContext.Products.Where(p => childCategoryIds.Contains(p.CategoryId)).ToList());
childCategories = childCategories.SelectMany(c => c.ChildCategories).ToList();
}
}
return View(products);
}
在上面的代码中,我们首先使用categoryId参数从数据库中检索类别。如果categoryId为null,则检索所有产品。否则,我们检索该类别下的所有产品,并使用while循环检索该类别下的所有子类别的产品。我们使用Many方法来检索所有子类别,并使用Contains方法来检索每个子类别下的产品。
示例2
- 创建模型类。
在“Models”文件夹中,创建一个名为“Product”的新类,并添加以下:
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
public int CategoryId { get; set; }
public virtual Category Category { get; set; }
}
public class Category
{
public int Id { get; set; }
public string Name { get; set; }
public int? ParentCategoryId { get; set; }
public virtual Category ParentCategory { get; set; }
public virtual ICollection<Category> ChildCategories { get; set; }
public virtual ICollection<Product> Products { get; set; }
}
在上面的代码中,我们定义了一个名为“Product”的模型类和一个名为“Category”的模型类。Product类具有CategoryId属性和Category导航属性,而Category类具有ParentCategoryId属性、ParentCategory导航属性、ChildCategories导航属性和Products导航属性。
- 创建DbContext类。
在“Models”文件夹中,创建一个名为“AppDbContext”的新类,并添加以下代码:
public class AppDbContext : DbContext
{
public DbSet<Product> Products { get; set; }
public DbSet<Category> Categories { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Category>()
.HasOptional(c => c.ParentCategory)
.WithMany(c => c.ChildCategories)
.HasForeignKey(c => c.ParentCategoryId);
}
}
在上面的代码中,我们定义了一个名为“AppDbContext”的DbContext类,并添加了一个名为“Products”的DbSet属性和一个名为“Categories”的DbSet属性我们还在OnModelCreating方法中定义了Category类的外键关系。
- 创建控制器和视图。
在“Controllers”文件夹中,创建一个名为“ProductController”的控制器,并添加以下代码:
public class ProductController : Controller
{
private readonly AppDbContext _dbContext;
public ProductController()
{
_dbContext = new AppDbContext();
}
public ActionResult Index(int? categoryId)
{
var category = _dbContext.Categories.Find(categoryId);
var products = category == null ? _dbContext.Products.ToList() : category.Products.ToList();
return View(products);
}
}
在上面的代码中,我们创建了一个名为“ProductController”的控制器,并在构造函数中实例化了一个名为“_dbContextAppDbContext对象。我们还创建了一个名为“Index”的操作方法,该方法接受一个可空的categoryId参数,并使用该参数从数据库中检索产品。
在“Views\Product”文件夹中,创建一个名为“Index.cshtml”的新视图,并添加以下代码:
model<Product>
<table>
<thead>
<tr>
<th>Id</th>
<th>Name</th>
<th>Price</th>
</tr>
</thead>
<tbody>
@foreach (var product in Model)
{
<tr>
<td>@product.Id</td>
<td>@product.Name</td>
<td>@product.Price</td>
</tr>
}
</tbody>
</table>
在上面的代码中,我们使用Razor语法创建了一个HTML表格,并使用C#代码从模型中检索产品列表。
- 在控制器中编写代码以获取多级类别组合下的产品。
在“ProductController”控制器中,我们可以使用以下代码获取多级类别组合下的产品:
public ActionResult Index(int? categoryId)
{
var category = _dbContext.Categories.Find(categoryId);
var products = category == null ? _dbContext.Products.ToList() : category.Products.ToList();
if (category != null)
{
var childCategories = category.ChildCategories.ToList();
while (childCategories.Any())
{
var childCategoryIds = childCategories.Select(c => c.Id);
products.AddRange(_dbContext.Products.Where(p => childCategoryIds.Contains(p.CategoryId)).ToList());
childCategories = childCategories.SelectMany(c => c.ChildCategories).ToList();
}
}
return View(products);
}
在上面的代码中,我们首先使用categoryId参数从数据库中检索类别。如果categoryId为null,则检索所有产品。否则,我们检索该类别下的所有产品,并使用while循环检索该类别下的所有子类别的产品。我们使用Many方法来检索所有子类别,并使用Contains方法来检索每个子类别下的产品。
结论
通过以上示例,我们可以看到如何在ASP.NET MVC中获取多级类别组合下的产品。我们创建了一个名为“Product”的模型类和一个名为“Category”的模型类,并使用DbContext创建了一个名为“Products”的表和一个名为“Categories”的表。我们还创建了一个名为“ProductController”的控制器,并使用DbContext从数据库中检索产品。最后,我们创建了一个名为“Index”的视图,并使用Razor语法显示产品列表。