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 ......不,他们不做人逻辑。 我无法显示底部内容
<section>
<h1><%# Eval("Subpage Title") %></h1>
<ul>
| </ul>
| <li><%# Eval("SubSubpage Title") %></li>
必须为Level 1指定一个空白的Separator转换,因此它不会继承Level 0.(哎呀!为什么只有当你打算继续使用所有其他未指定的级别时,为什么才指定0级的分隔符?Kentico,你就是我秃头的原因!)
最后,
<!-- Only works on the Footer, not the Separator:
<%# Eval("Subpage Bottom Content") %>-->
</section>
(为什么我必须为分隔符和页脚创建转换?为什么我不能只做Footer - 最合乎逻辑的意义 - 它应用于0级的每个项目?我离题了。)
我的底部内容不起作用的原因是因为您似乎无法在分隔符转换上Eval()
文档字段。
我已经在这方面工作了很长时间,弄清楚并且几乎同样如此地描述这个问题是非常复杂的。请帮忙。 我需要知道如何使用分层转换完成上面所需的输出(或者如果你知道的话,还有别的东西)!我正在使用Kentico 7(不幸的是)。
更新:我只有CMSDesk和SiteManager的前端访问权限,我既无法访问后端文件系统,也无法了解斯堪的纳维亚语中的ASP.NET。
答案 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),其中应该呈现子级别。