在ASP.NET Core中使用razor在表中递归
我有以下产品类别型号:在ASP.NET Core中使用razor在表中递归,razor,asp.net-core-mvc,asp.net-core-2.0,Razor,Asp.net Core Mvc,Asp.net Core 2.0,我有以下产品类别型号: public class ProductCategory { public int Id { get; set; } public int? ParentId { get; set; } public string Title { get; set; } } 使用父Id,我希望在选项卡列表中显示类别和子类别(最多三个级别)的列表,如下所示: <table> <tr><td colspan="3">Cat
public class ProductCategory
{
public int Id { get; set; }
public int? ParentId { get; set; }
public string Title { get; set; }
}
使用父Id,我希望在选项卡列表中显示类别和子类别(最多三个级别)的列表,如下所示:
<table>
<tr><td colspan="3">Category #1</td></tr>
<tr><td></td><td>Category #1.1</td><td></td></tr>
<tr><td></td><td>Category #1.2</td><td></td></tr>
<tr><td colspan="2"></td><td>Category #1.2.1</td></tr>
<tr><td colspan="2"></td><td>Category #1.2.2</td></tr>
<tr><td colspan="3">Category #2</td></tr>
</table>
类别#1
类别#1.1
类别#1.2
类别#1.2.1
类别#1.2.2
类别#2
我试图实现,但我不明白如何将数据传递给局部视图。“我的类别”中没有对儿童的引用,而是对父母的引用。要模拟您引用的解决方案,您必须向实体中至少添加一个导航属性。通过这种方式,您可以有效地枚举每个
ProductCategory
的子级
我建议使用以下实体声明,这不会在数据库中造成额外的副作用。为方便起见,它有两个导航属性:
public class ProductCategory
{
public int Id { get; set; }
public string Title { get; set; }
[ForeignKey(nameof(ParentCategory))]
public int? ParentId { get; set; }
public ProductCategory ParentCategory { get; set; } //nav.prop to parent
public ICollection<ProductCategory> Children { get; set; } //nav. prop to children
}
然后,该视图将这些顶级类别作为一个模型(我强烈建议为此创建一个ViewModel),并使用Partial以递归方式渲染所有子级:
@model IEnumerable<ProductCategory>
<table>
@Html.Partial("CategoryRowPartial", Model)
</table>
现在,这并没有考虑到每个子级的级别,也没有考虑空的(相当松散的)td&colspan。就我个人而言,我会使用
或
来实现这一点。它们用于显示层次结构
如果您坚持使用
,我再次建议您创建一个专门的视图模型,它可以保存每个表行的“深度”
@model IEnumerable<ProductCategory>
<table>
@Html.Partial("CategoryRowPartial", Model)
</table>
@model IEnumerable<ProductCategory>
@foreach (var category in Model)
{
<tr><td>@category.Title</td></tr>
@Html.Partial("CategoryRowPartial", category.Children)
}