我正在Kentico中使用Repeater Web部件从内容树中挑选页面,以基于ASCX转换生成结构良好的可重复的结构化HTML片段。 (这里没有惊喜 - 它一直很好用!)。
然而,一项新的要求与上述现有的HTML结构并列,每个重复的项目还必须有一个区域,我们可以添加任何数量的额外内容;基于其他网页部分。
我之前写过一些"布局"类型网络部件;实施CMSAbstractLayoutWebPart
,如here所述,这让我可以生成重复数量的网页区域,所以我觉得我已经在那里了一半。但问题是,就目前而言,我似乎无法利用页面类型转换的强大功能和灵活性(我认为我需要这样做,而且看起来像它应该是可能的..)。
我想我可以直接在转换标记中指定WebPartZone控件,如下所示:
<%@ Register Src="~/CMSInlineControls/WebPartZone.ascx" TagName="CMSWebPartZone" TagPrefix="cms" %>
<cms:CMSWebPartZone ZoneID="ZoneIDHere" runat="server" />
<div>
<h3><%# Eval("Heading") %></h3>
<p><%# Eval("Summary") %></p>
</div>
但是设计视图似乎没有拿起网络部分区域;所以我假设页面生命周期可能不允许我按照我的希望这样做。
所以我想知道的是:
谢谢!
关于编辑经验的好点;我一定希望尽可能保持一致。对我来说,问题是驱动我的数据结构的要求并不总是完全被理解 - 并且肯定会发生变化。此外,它们可能会因不同产品而有所不同(尽管有些微妙)。因此,我一直在尝试保持模板和页面类型或多或少相同,并将差异推送到通过宏驱动Web部件配置的页面属性。因此,鉴于转换方法不起作用,我希望自定义Web部件适合我。
我会发表我的发现!
答案 0 :(得分:1)
我认为将Web部件区域添加到转换中并不是一个正确的方向,因为Web部件区域应该是页面模板的一部分(而不是转换)才能使用它。
我可能会尝试整理我的内容,以便您当前在转发器中显示的每个项目都有任意数量的子页面(可能是不同类型的)并使用类似分层查看器的内容,以便在页面上显示所有这些内容。它允许基于页面类型或节点级别使用不同的转换。这种方法的另一个优点是让编辑保持一致。
答案 1 :(得分:1)
最后,我能够使用转换标记来指定Web部件区域的生成。我开始创建一个继承自CMSAbstractLayoutWebPart
的自定义Web部件,而不是使用CMSRepeater
网络部件或类似的...
这是我需要做的事情的细分:
TreeProvider.SelectNodes()
将其提供给Web部件代码中的OnInit()
方法方法)TransformationInfoProvider.GetTransformation(this.TransformationName)
宏分辨率代码示例(带宏的HTML转换)
protected virtual string ResolveNode(TreeNode node)
{
var resolver = this.ContextResolver.CreateChild();
resolver.AddAnonymousSourceData(node);
return resolver.ResolveMacros(rawTransformationMarkup);
}
CMSAbstractLayoutWebPart
父类中可用的方法,详细here,Append()
已解析的标记和也可以根据需要调用AddZone()
以进入响应字符串构建器总结:API的强大功能使我完全避免使用任何转发器控件。我可以生成Web部件区域作为布局Web部件常规布局生成过程的一部分。
如果我能弄清楚如何在ASCX转换中解析SCRIPT标签中的表达式以完成故事,那将是很好的,但通过使用HTML转换,我可以使用上述方法来完成我需要的工作。