不能在分隔符转换上使用Eval()[Hierarchical transformations]

时间:2014-12-31 20:20:25

标签: web-parts hierarchy kentico

是魔鬼!使用HierarchicalViewer WebParts(这是我尝试它们的第一天)。我有以下层次结构:

  • Main Page
    • SubPage 1 [文档包含字段:标题简介底部内容]
      • SubSubpage 1.1
      • SubSubpage 1.2
      • SubSubpage 1.3
    • SubPage 2 [相同字段...]
      • ...

Main Page上,我想自动显示每个Subpage:包括Subpage 标题简介,所有SubSubpage的列表,然后是Subpage 底部内容。换句话说:

期望的输出:

<section>
    <h1>[Subpage 1 Title]</h1>
    <p>[Subpage 1 Intro]</p>
    <ul>
        <li>[SubSubpage 1.1 Title]</li>
        <li>[SubSubpage 1.2 Title]</li>
        <li>[SubSubpage 1.3 Title]</li>
    </ul>
    <p>[Subpage 1 Bottom Content]</p>
</section>

<section>
    <h1>[Subpage 2 Title]</h1>
    <p>[Subpage 2 Intro]</p>
    <ul>
        <li>[SubSubpage 2.1 Title]</li>
        <li>[SubSubpage 2.2 Title]</li>
        <li>[SubSubpage 2.3 Title]</li>
    </ul>
    <p>[Subpage 2 Bottom Content]</p>
</section>

...

简单,对吧?不是为了Kentico ......不,他们不做人逻辑。 我无法显示底部内容

我有以下层次转换:

级别0的项目转换:

<section>
    <h1><%# Eval("Subpage Title") %></h1>

级别1(分别)的页眉,页脚和项目转换:

<ul> | </ul> | <li><%# Eval("SubSubpage Title") %></li>

必须为Level 1指定一个空白的Separator转换,因此它不会继承Level 0.(哎呀!为什么只有当你打算继续使用所有其他未指定的级别时,为什么才指定0级的分隔符?Kentico,你就是我秃头的原因!)

最后,

级别0的分隔符和页脚转换:

    <!-- Only works on the Footer, not the Separator:
        <%# Eval("Subpage Bottom Content") %>-->
</section>

(为什么我必须为分隔符和页脚创建转换?为什么我不能只做Footer - 最合乎逻辑的意义 - 它应用于0级的每个项目?我离题了。)

我的底部内容不起作用的原因是因为您似乎无法在分隔符转换上Eval()文档字段。

我已经在这方面工作了很长时间,弄清楚并且几乎同样如此地描述这个问题是非常复杂的。请帮忙。 我需要知道如何使用分层转换完成上面所需的输出(或者如果你知道的话,还有别的东西)!我正在使用Kentico 7(不幸的是)。


更新:我只有CMSDesk和SiteManager的前端访问权限,我既无法访问后端文件系统,也无法了解斯堪的纳维亚语中的ASP.NET。

2 个答案:

答案 0 :(得分:1)

进行了大量的挖掘以解决这个问题,虽然我同意Kentico的API是一团糟,看起来这实际上是ASP.NET的<asp:repeater>的限制控制Kentico的中继者和观众所依据的。

请查看this question on SO,其中有人遇到与<asp:repeater>的分隔符模板相同的问题。

然后,查看显示可能的解决方法的this answer

我还没有弄清楚为什么项目分隔符不能eval()绑定到asp:repeater的数据,但every example我找到了显示项目分隔符仅包含纯文本 - 没有数据正在解析。

作为分层转换的替代方法,您可以随时尝试嵌套转发器并绑定其数据OnInit(如果必须,有时您不会)。如果你太复杂,它可能会变得混乱,但它是一种可靠的技术。

例如,在页面模板中设置转发器后,将其添加到转发器的转换中:

  <cms:CMSRepeater 
      ID="ControlID"
      DelayedLoading="true"
      runat="server" 
      Path="./%"
      ClassNames="custom.DocTypeName;" 
      CategoryName="" 
      MaxRelativeLevel="-1" 
      SelectTopN="0" 
      SelectOnlyPublished="true"                      
      OrderBy=""
      Columns=""
      TransformationName="custom.DocTypeName.TransformationName"
      RelationshipName="" 
      RelatedNodeIsOnTheLeftSide=""
      HideControlForZeroRows="false" 
      enableViewState="false" 
  />
  <script runat="server">
    protected override void OnInit(EventArgs e)
    { 
      // an example of how to bind data OnInit
      // to get the data you need
      ControlID.WhereCondition = "NodeParentID = '"+ GetSearchValue("NodeID")+"'";  
    } 
  </script>

答案 1 :(得分:1)

在这种情况下(但一般情况下),最干净和正确的解决方案是使用嵌套转发器(如Jerreck建议的那样)。

你只需要这两个转变;主要的一个:

<section>
  <h1><%# Eval("Title") %></h1>
  <p><%# Eval("Intro") %></p>
  <ul>
    <cms:CMSRepeater ID="repListItems" runat="server" DelayedLoading="true" 
       ClassNames="your.ClassName" TransformationName="your.NestedRepeater.TransformationID" />
  </ul>
  <p><%# Eval("BottomContent") %></p>
</section>

和一个子子页面:

<li><%# Eval("DocumentName") %></li>

当然,将Web部件的嵌套控件ID属性设置为适当的值。无需进一步编码。您可以找到有关使用嵌套控件here的更多信息。希望它会帮助你。

注意:使用Kentico v8 +,您可以指定转换中的位置(使用SubLevelPlaceHolder),其中应该呈现子级别。