n个未知的n的循环

时间:2016-03-21 05:03:32

标签: c# asp.net-mvc entity-framework nested-loops razorengine

我有以下Entity Framework类,其中一列是同一张表中Foreign Key的{​​{1}}列:

Primary 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; } } 并选择Children,我就可以将ItemParentID属性中的所有子项都提升到第n级。

现在,我必须在Items视图中将此数据与所有子项及其子项等绑定在一起。我已经开始使用以下代码:

razor

以上代码适用于2个级别的子项,但我想将所有子项及其子项的数据绑定到第n级。我已经检查了@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> } 上的其他问题,但它们很复杂,而且大多数问题都没有处理上面提到的SO lists属性。完成任务的简单方法是什么?

2 个答案:

答案 0 :(得分:1)

您可以像这样递归使用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>

答案 1 :(得分:0)

使用递归的部分视图可以很好地解决这个问题。

<强> 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>
}