【发布时间】: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