由变换生成的Kentico Web部件区域

时间:2016-12-28 21:51:36

标签: asp.net kentico

我正在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>

但是设计视图似乎没有拿起网络部分区域;所以我假设页面生命周期可能不允许我按照我的希望这样做。

所以我想知道的是:

  1. 是否可以在转换中包含WebPartZone控件,以便我可以在设计视图中引入新的Web部件?
  2. 如果没有,推荐的方法是什么? (如果要使用自定义Web部件,我想在第一个实例中克隆Repeater Web部件,因为将需要许多现有属性 - 但可能这仍然必须继承自{{1} }?
  3. 谢谢!

    更新

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

    我会发表我的发现!

2 个答案:

答案 0 :(得分:1)

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

我可能会尝试整理我的内容,以便您当前在转发器中显示的每个项目都有任意数量的子页面(可能是不同类型的)并使用类似分层查看器的内容,以便在页面上显示所有这些内容。它允许基于页面类型或节点级别使用不同的转换。这种方法的另一个优点是让编辑保持一致。

答案 1 :(得分:1)

最后,我能够使用转换标记来指定Web部件区域的生成。我开始创建一个继承自CMSAbstractLayoutWebPart的自定义Web部件,而不是使用CMSRepeater网络部件或类似的...

这是我需要做的事情的细分:

  • 为自定义布局类型的Web部件提供一些查询内容树的属性,并在初始化后通过覆盖TreeProvider.SelectNodes()将其提供给Web部件代码中的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父类中可用的方法,详细hereAppend()已解析的标记和也可以根据需要调用AddZone()以进入响应字符串构建器

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

如果我能弄清楚如何在ASCX转换中解析SCRIPT标签中的表达式以完成故事,那将是很好的,但通过使用HTML转换,我可以使用上述方法来完成我需要的工作。