转换生成的 Kentico Web 部件区域

Kentico Web Part Zone(s) generated by Transformations

我正在使用 Kentico 中的 Repeater Web 部件从内容树中挑选页面,以基于 ASCX 转换生成结构化 HTML 的可重复片段。 (这里没有惊喜 - 它一直工作得很好!)。

但是,除了上面提到的现有 HTML 结构之外,还出现了一项新要求,每个重复的项目还必须有一个区域,我们可以在其中添加任意数量的附加内容;基于其他 Web 部件。

我之前写过几个"layout"类型的web部件;实施 CMSAbstractLayoutWebPart,如 here 所述,这使我能够生成重复数量的 Web 部件区域,所以我觉得我已经完成了一半。但问题是,就目前而言,我似乎无法利用页面类型转换的强大功能和灵活性(我真的认为我需要这样做,而且看起来应该这样做有可能..).

我想我可以直接在转换标记中指定 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 部件区域;所以我假设页面生命周期可能不允许我像我希望的那样执行此操作。

所以我想知道的是:

  1. 是否可以在转换中包含 WebPartZone 控件,以便我可以在设计视图中引入新的 Web 部件?
  2. 如果没有,推荐的解决方法是什么? (如果自定义 Web 部件是可行的方法,我想首先克隆 Repeater Web 部件,因为将需要它的许多现有属性 - 但大概这仍然必须继承自 CMSAbstractLayoutWebPart

谢谢!

更新

关于编辑的经验的好点;我绝对希望尽可能保持一致。对我来说,问题是驱动我的数据结构的需求并不总是被完全理解——而且肯定会发生变化。此外,它们可能会因不同的产品而有所不同(尽管很微妙)。因此,我一直在尝试使模板和页面类型大致相同,并将差异推送到通过宏驱动 Web 部件配置的页面属性中。因此,鉴于转换方法行不通,我希望自定义 Web 部件适合我。

我会post我的发现!

我认为将 Web 部件区域添加到转换中不是正确的方向,因为 Web 部件区域应该是页面模板(而不是转换)的一部分才能使用它。

我可能会尝试组织我的内容,以便您当前在中继器中显示的每个项目都有任意数量的子页面(可能是不同类型的),并使用诸如分层查看器之类的东西来显示所有这些这一页。它允许根据页面类型或节点级别使用不同的转换。这种方法的另一个优点是您可以使编辑体验保持一致。

最后,我能够使用转换标记来指定 Web 部件区域的生成。我沿着创建继承自 CMSAbstractLayoutWebPart 的自定义 Web 部件的路线走下去,而不是使用 CMSRepeater Web 部件或类似的...

这是我需要执行此操作的细目分类:

  • 为自定义布局类型的 Web 部件提供一些用于查询内容树的属性,并在初始化后将它们提供给 Web 部件代码中的 TreeProvider.SelectNodes() 方法(通过覆盖 OnInit()方法)
  • 为 Web 部件提供一个 TransformationName 属性,以便可以使用 TransformationInfoProvider.GetTransformation(this.TransformationName)
  • 检索原始标记
  • 使用上面的标记并使用节点查询中的每个节点解析其中的宏

宏解析代码示例(HTML 使用宏进行转换)

protected virtual string ResolveNode(TreeNode node)
{
    var resolver = this.ContextResolver.CreateChild();
    resolver.AddAnonymousSourceData(node);
    return resolver.ResolveMacros(rawTransformationMarkup);
}
  • 然后我在转换标记中寻找占位符文本,并使用 CMSAbstractLayoutWebPart 父 class(es) 中可用的方法,详见 hereAppend() 已解析的标记,并根据需要调用 AddZone() 以进入响应字符串构建器

总结:API 的强大功能使我能够完全避免使用任何中继器控件。我可以生成 Web 部件区域作为布局 Web 部件常规布局生成过程的一部分。

如果我能弄清楚如何在 ASCX 转换中解析 SCRIPT 标记中的表达式来完成这个故事,那就太好了,但是通过使用 HTML 转换,我可以使用上面的方法来完成我需要的。