【问题标题】:Kentico Web Part Zone(s) generated by Transformations转换生成的 Kentico Web 部件区域
【发布时间】:2017-05-13 05:15:15
【问题描述】:

我在 Kentico 中使用 Repeater Web 部件从内容树中挑选页面,以基于 ASCX 转换生成可重复的结构化 HTML 的 sn-ps。 (这并不奇怪 - 它运行良好!)。

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

我之前写过一些“布局”类型的 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 部件适合我。

我将发布我的发现!

【问题讨论】:

    标签: asp.net kentico


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      最后,我能够使用转换标记来指定 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父类中可用的方法,详细here,到Append()解析标记,也调用AddZone()作为需要利用响应字符串构建器

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

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

      【讨论】:

        猜你喜欢
        • 2020-09-20
        • 2012-07-08
        • 2018-08-22
        • 2018-10-07
        • 2015-07-16
        • 1970-01-01
        • 2017-03-01
        • 2018-09-14
        • 2011-07-07
        相关资源
        最近更新 更多