在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)
}