如何在使用列表中列表的内容模块中的 C# 模板中使用渲染子模板?

How can I use Render sub-template in a C# template in a Content module that uses lists within lists?

2SXC 10.25.2 / DNN 9.3.2

我有一个 2sxc 模块,它使用启用了“列表”的 C# 模板。我有一个名为“路径”的内容类型,在其中我有 2 个实体选择器字段用于“第一步会话”,然后是“下一步会话”。这些实体选取器使用“会话”内容类型。在每个“会话”内容类型中,我还有一个用于“发言人”的实体选择器。总而言之,这是一个列表中的列表中的列表的设置。

当我为每个子列表创建循环时,我可以在 1 个 C# 模板中轻松执行此操作,但它变得重复、冗长且不守规矩,因为有太多的 C# 代码,我在其中循环相同的会话模板对于不同的实体选择器部分。因此,我尝试使用“渲染子模板”代码来简化模板——我创建了新的子模板并将它们插入——起初它似乎有效,但是,模板开始将所有“会话”项目输出到每个项目中列表。

我怀疑子模板以某种方式丢失了它所在项目的上下文,所以它输出了所有内容。关于为每个循环使用子模板,我需要了解一些特别的事情吗?我是否必须包含参数?如果是,我该怎么做?

编辑以包含代码示例:

这是我正在使用的代码的一个小型简化版本:

@foreach(var Content in AsList(Data)) {
<h2>@Content.Title</h2>
    
    <h3>Lead Sessions</h3>
    
    <div class="lead-sessions text-green">
        @foreach(var item in AsList(Content.LeadSessions as object)){
            <h4>@item.LeadSessionTitle</h4>
            <p>@item.LeadSessionText</p>
        }
    </div>    
        
    <h3>Next Sessions</h3>
    <div class="next-sessions text-green">
        @foreach(var nextitem in AsList(Content.NextSessions as object)){
            <h4>@nextitem.LeadSessionTitle</h4>
            <p>@nextitem.LeadSessionText</p>
        }
    </div>
}

我想制作一个子模板,这样我就不必为会话循环重复相同的代码。我如何简化此模板以使用子模板在引导会话和下一个会话中循环会话?

是的,您可以不带参数地使用 RenderPage,或者像在博客应用程序中那样传入参数:

@RenderPage("shared/_Category Filter.cshtml", new { MobileView = true, FilteredCategory = filteredCategory })

https://github.com/2sic/app-blog/blob/master/_List.cshtml#L25

然后模板可以检索像

这样的值
@{
  var filteredCategory = PageData["FilteredCategory"];
}

https://github.com/2sic/app-blog/blob/master/shared/_Category%20Filter.cshtml#L6

您可以像这样传递任意数量的 values/objects。

您还可以创建助手 - 然后调用这些助手。像这样

https://github.com/2sic/app-news/blob/master/shared/_Helpers.cshtml#L24-L33

所以根据修改后的问题,有点像这样

@foreach(var Content in AsList(Data)) {
    <h2>@Content.Title</h2>
    
    <h3>Lead Sessions</h3>
    @RenderPage("_inner.cshtml", new { Items = Content.LeadSessions })
        
    <h3>Next Sessions</h3>
    @RenderPage("_inner.cshtml", new { Items = Content.NextSessions })
}

第二个文件_inner.cshtml

@{
  var items = AsList(PageData["Items"]);
}
<div class="next-sessions text-green">
    @foreach(var nextitem in items){
        <h4>@nextitem.LeadSessionTitle</h4>
        <p>@nextitem.LeadSessionText</p>
    }
</div>