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

Razor 在使用列表中的列表的内容模块中,如何在C#模板中使用渲染子模板?,razor,dotnetnuke,2sxc,Razor,Dotnetnuke,2sxc,2SXC 10.25.2/DNN 9.3.2 我有一个2sxc模块,它使用启用了“列表”的C#模板。我有一个名为“路径”的内容类型,里面有两个实体选择器字段,分别用于“第一步会话”和“下一步会话”。这些实体选择器使用“会话”内容类型。在每个“会话”内容类型中,我还为“演讲者”设置了一个实体选择器。总而言之,这是一个设置,我在列表中有列表 当我为每个子列表创建循环时,我可以很容易地在1c#模板中完成,但它变得重复、冗长且难以控制,因为有太多的C#代码,我将同一个会话模板循环到不同的实体选择器部分。

2SXC 10.25.2/DNN 9.3.2

我有一个2sxc模块,它使用启用了“列表”的C#模板。我有一个名为“路径”的内容类型,里面有两个实体选择器字段,分别用于“第一步会话”和“下一步会话”。这些实体选择器使用“会话”内容类型。在每个“会话”内容类型中,我还为“演讲者”设置了一个实体选择器。总而言之,这是一个设置,我在列表中有列表

当我为每个子列表创建循环时,我可以很容易地在1c#模板中完成,但它变得重复、冗长且难以控制,因为有太多的C#代码,我将同一个会话模板循环到不同的实体选择器部分。因此,我尝试使用“Render sub template”代码来简化模板-我创建了新的子模板并将它们插入其中-起初它似乎可以工作,但是,模板开始将所有“会话”项输出到列表中的每个项中

我怀疑子模板不知何故丢失了它所在项的上下文,因此它输出了所有内容。关于使用子模板for each循环,我需要了解一些特殊的信息吗?我必须包括参数吗?如果是,我该怎么做

编辑以包含代码示例:

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

@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>
}
@foreach(AsList(数据)中的var内容){
@内容.标题
领导会议
@foreach(AsList中的var项(Content.LeadSessions作为对象)){
@item.LeadSessionTitle
@item.LeadSessionText

} 下一届会议 @foreach(AsList中的var nextitem(Content.NextSessions作为对象)){ @nextitem.LeadSessionTitle @nextitem.LeadSessionText

} }

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

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

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

然后模板可以检索如下值

@{
  var filteredCategory = PageData["FilteredCategory"];
}

您可以像这样传递任意数量的值/对象

您还可以创建帮助程序,然后调用这些帮助程序。像这样


是的,您可以不使用参数而直接使用
RenderPage
,或者像在博客应用程序中一样传入参数:

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

然后模板可以检索如下值

@{
  var filteredCategory = PageData["FilteredCategory"];
}

您可以像这样传递任意数量的值/对象

您还可以创建帮助程序,然后调用这些帮助程序。像这样


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

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

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

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

下一次我将尝试这些示例。对于其他正在寻找此内容的人来说,最好的答案是:)知道我有一个名为“学习路径”的内容类型,它有两个实体选择器字段用于“潜在客户会话”和“下一个会话”,其中这些会话的子模板是相同的,但仅通过父标记进行区分,我如何设置参数以确保Lead和下一个会话仅显示该学习路径?我用一些示例代码和说明编辑了我的原始帖子。下次我将尝试这些示例。对于其他寻找此选项的人来说,最好的答案是:)知道我有一个名为“学习路径”的内容类型有两个实体选择器字段用于“潜在客户会话”和“下一个会话”,其中这些会话的子模板相同,但仅通过父标记区分,我如何设置参数,以确保Lead和下一个课程只针对该学习路径进行展示?我编辑了我的原始帖子,并提供了一些示例代码和说明。