【问题标题】:Recursion in ASP.NET Core Razor viewsASP.NET Core Razor 视图中的递归
【发布时间】:2016-12-01 02:40:31
【问题描述】:

我现在有以下代码来编写带有指向控制器操作的链接的平面项目列表:

<ul>
    @foreach (var item in items)
    {
        <li>
            <a asp-controller="Home" asp-action="Demo" asp-route-itemName="@item.Name">
                @item.Name
            </a>
        </li>
    }
</ul>

现在这必须变成递归的。项目还可以包含子项目。对于递归,我需要某种功能。我知道我可以使用@functions 并在 .cshtml 文件中定义函数。不确定这种带有标签助手的漂亮的内联 HTML 代码是否仍然允许在那里,似乎不是这样。另一种选择是 .cs 文件中的 HTML 帮助程序,这里肯定没有内联 HTML。 @helper 似乎不再可用。

还有哪些其他选项可以定义函数并保留 Razor 提供的内联 HTML 语法?

【问题讨论】:

  • 您可以检查项目是否有子列表,然后再次渲染相同的视图。
  • 我已经在 ASP.NET 4.6 中实现了它,但我对核心的客户端语法一无所知。如果你愿意,我仍然会分享代码
  • 我的场景是,如果评论有回复,则再次呈现 cmets 视图以查看对该评论的回复,但您需要有一个 bool 字段来查看该项目是否有该代码的子项目上班
  • 整个代码都在一个完整的视图中,该视图呈现一个动作的结果。我不明白这应该如何“再次渲染”。
  • 我已经使用@Html.RenderAction() 方法再次渲染相同的动作。

标签: asp.net razor asp.net-core-mvc


【解决方案1】:

将用于呈现评论的代码放在局部视图中,并通过调用@Html.Partial("comment", comment) 来呈现它。

然后在该评论部分视图中,您将拥有类似的内容

@model Comment

Title: @Model.Title
Message: @Model.Message

@if (Model.ChildComments.Any())
{
    <ul>
        @foreach (var childComment in Model.ChildComments)
        {
            <li>
                @Html.Partial("comment", childComment)
            </li>
        }
    </ul>
}

这将递归地呈现每条评论及其所有子项(如果有)。

【讨论】:

  • 这是唯一适用于 .NET Core 2.x(和 1.x?)的解决方案。如果您有幸使用 .NET Core 3.x(可能是 .NET Framework 5),您可以使用本地 void 方法并自行调用。
  • 对于几行重复的 HTML 需要一个完全独立的 .cshtml 文件似乎有点过分......
猜你喜欢
  • 2018-02-24
  • 1970-01-01
  • 2021-08-27
  • 2010-10-30
  • 1970-01-01
  • 1970-01-01
  • 2020-10-27
  • 2019-06-21
  • 2021-08-01
相关资源
最近更新 更多