n 循环次数,其中 n 未知

n number of loops where n is not known

我有以下 Entity Framework class 和 table 中的 Foreign KeyPrimary Key 的列:

[Table("Items")]
public class Item
{
    [Key]
    public long ItemID { get; set; }

    public string ItemName { get; set; }

    public long? ItemParentID { get; set; }

    [ForeignKey("ItemParentID")]
    public virtual Item Parent { get; set; }

    public virtual ICollection<Item> Children { get; set; }

}

上面的映射效果很好,我只需传递 ItemParentID 并选择 [=,就可以将 Children 属性 中的所有子项目提升到第 n 级17=]。

现在我必须将此数据与我的 razor 视图中的所有子项及其子项等绑定在一起。我从以下代码开始:

@if (Model.ChildItems.Count > 0)
    {
        foreach (Item parentItem in Model.ChildItems)
        {
            <div class="list-title">
                <span>@parentItem.ItemName</span>
                <ul>
                    @if (parentItem.Children.Count > 0)
                    {
                        foreach (Item childItem in parentItem.Children)
                        {
                            <li>
                                <a href="@FrontEndDomain.GetWebsiteURL()/@childItem.ItemID/details/@FrontEndDomain.GetURLString(Model.ParentItemName)/@FrontEndDomain.GetURLString(childItem.ItemName)" title="@childItem.ItemName">
                                    @childItem.ItemName
                                </a>
                            </li>
                        }
                    }
                    else
                    {
                        <li>
                            No items available for @parentItem.ItemName.
                        </li>
                    }
                </ul>
            </div>
        }
    }
    else
    {
        <h4>No items available.</h4>
    }

以上代码适用于 2 级子项,但我想将所有子项及其子项的数据绑定到第 n 级。我已经检查了关于 SO 的其他问题,但它们很复杂,而且大多数都没有像上面提到的 Children 属性 那样处理 lists。有什么简单的方法可以完成吗?

您可以像这样递归使用 Html.RenderPartial 助手(它只是 example,没有您的特定标记):

查看:

@model Item

<p>@Model.ItemName</p>
<ul>
    @if (Model.Children != null && Model.Children.Count > 0)
    {
        foreach (var child in Model.Children)
        {
            <li>
                @{Html.RenderPartial("Index", child);}
            </li>
        }
    }
    else
    {
        <li>
            No items available for @Model.ItemName.
        </li>
    }
</ul>

你可以用递归局部视图很好地解决这个问题。

RecursivePartial.cshtml:

@model Item

<span>@Model.ItemName</span>
<ul>
    @if (Model.Children?.Any() ?? false)
    {
        foreach (var child in Model.Children)
        {
            <li>
                @Html.Partial("RecursivePartial", child)
            </li>
        }
    }
    else
    {
        <li>
            No items available for @Model.ItemName.
        </li>
    }
</ul>

然后您可以从任何需要的地方调用这个部分视图

Index.cshtml:

@model IEnumerable<Item>

@if (Model?.Any() ?? false)
{
    foreach (var item in Model)
    {
        @Html.Partial("RecursivePartial", item)
    }
}
else
{
    <h4>No items available.</h4>
}