【问题标题】:n number of loops where n is not knownn 个循环,其中 n 未知
【发布时间】:2023-03-14 14:26:01
【问题描述】:

我有以下Entity Framework 类,其列是Foreign Key 到同一张表中的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; }

}

上面的映射效果很好,我只需传递ItemParentID 并选择Items 就可以将Children 属性中的所有子项设置到第n 级。

现在我必须在我的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。有什么简单的方法来完成这项工作吗?

【问题讨论】:

  • 你需要的是一个递归函数。一种选择是创建一个 HtmlHelper 扩展方法,如this answer 所示
  • 嗯...您可以尝试使用@helper 方法递归地渲染它。传入当前节点作为参数,然后迭代并渲染子节点。 @helper 语法示例在这里... stackoverflow.com/a/6532107/4322803
  • 我很难相信 SO 上的其他答案不处理包含列表的列表 - 没有那么多其他选项。你能把你看过的链接贴出来吗?

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


【解决方案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>

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 你错了,我和你同时写了答案。
    猜你喜欢
    • 1970-01-01
    • 2012-12-29
    • 2019-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-29
    相关资源
    最近更新 更多