Kentico 9 - 在转换中显示语言选择器
Kentico 9 - Display language selector inside transformation
我正在尝试在转换中显示语言选择器。
如果我将 Web 部件添加到页面但在转换中定义它们则不起作用。
这是我目前在转换中的内容,但转发器只显示 "Nothing!"。
<cms:LanguageDataSource ID="dsLanguages" ExcludeUntranslatedDocuments="false" ExcludeCurrentCulture="false" runat="server" />
<ul class="sub-menu">
<cms:BasicRepeater ID="rptLanguages" DataSourceName="dsLanguages" ZeroRowsText="Nothing!" runat="server">
<ItemTemplate>
<li class="menu-item">
<a href="<%# Eval("URL") %>"><span class="flag-icon flag-icon-<%# Eval("CultureCode") %>"></span><%# Eval("CultureName") %></a>
</li>
</ItemTemplate>
</cms:BasicRepeater>
</ul>
这是个很好的问题,我发现在 Transformations 或 ASPX 模板 中使用 Web 部件通常存在很多混淆.
这里的重点是
Web parts are not generally supported in transformations or ASPX templates
由于 Web 部件通常是用户控件,您可以在转换中注册它们,但由于它们的特定生命周期,无法保证它们会实际工作。更复杂的 Web 部件肯定不起作用,语言选择器似乎也是如此。
官方documentation声明:(查看更新)
在转换中使用控件
You can register and use user
controls and servers controls inside transformations. See that done
Transformation examples. However, using web parts in transformations
is not recommended for performance reasons.
但是,这并不完全准确,因为它们根本不受支持。我已经向 Kentico 的技术作者提交了一个请求来解决这个问题。
您最终可以尝试从语言选择器中创建一个常规 用户控件 并注册它,尽管我不完全确定它是否有帮助。我知道一些 Kentico 默认转换确实在注册用户控件,因此在某些情况下可能会有所帮助。
一般来说,尽可能避免在转换中使用用户控件。我建议您只将语言选择器 Web 部件放在转换之外,这将是无需任何其他调整即可使其正常工作的最简单方法。
更新:
在与 Kentico 团队交谈后,注释 here 已更改为:
以反映当前状态
We do NOT recommend using web parts within the code of
transformations. This could lead to poor performance and certain web
parts may not work correctly within transformations due to their life
cycle.
我同意 Enn 的观点,转发器控件的生命周期可能有问题,因为它是动态添加到页面中的。
您是否尝试过使用 CMSRepeater 控件而不是 BasicRepater 和 DelayedLoading 属性设置为 true?
问题是您的数据源没有返回任何数据。
如果您不需要在转换中动态生成数据源的属性,我建议您将语言数据源 Web 部件放在它工作正常的页面上,并在转型.
语言数据源 Web 部件可能缺少上下文中的某些内容。在内部,DS 的 Node
属性 使用 DocumentContext.CurrentDocument
,这在转换中可能不可用。这要么是这个,要么是 Enn 所说的关于具有不同周期的控件。
另一种选择是将自定义 C# 代码放在 <% %>
括号内并以编程方式检索您需要的数据。
我正在尝试在转换中显示语言选择器。
如果我将 Web 部件添加到页面但在转换中定义它们则不起作用。
这是我目前在转换中的内容,但转发器只显示 "Nothing!"。
<cms:LanguageDataSource ID="dsLanguages" ExcludeUntranslatedDocuments="false" ExcludeCurrentCulture="false" runat="server" />
<ul class="sub-menu">
<cms:BasicRepeater ID="rptLanguages" DataSourceName="dsLanguages" ZeroRowsText="Nothing!" runat="server">
<ItemTemplate>
<li class="menu-item">
<a href="<%# Eval("URL") %>"><span class="flag-icon flag-icon-<%# Eval("CultureCode") %>"></span><%# Eval("CultureName") %></a>
</li>
</ItemTemplate>
</cms:BasicRepeater>
</ul>
这是个很好的问题,我发现在 Transformations 或 ASPX 模板 中使用 Web 部件通常存在很多混淆.
这里的重点是
Web parts are not generally supported in transformations or ASPX templates
由于 Web 部件通常是用户控件,您可以在转换中注册它们,但由于它们的特定生命周期,无法保证它们会实际工作。更复杂的 Web 部件肯定不起作用,语言选择器似乎也是如此。
官方documentation声明:(查看更新)
在转换中使用控件
You can register and use user controls and servers controls inside transformations. See that done Transformation examples. However, using web parts in transformations is not recommended for performance reasons.
但是,这并不完全准确,因为它们根本不受支持。我已经向 Kentico 的技术作者提交了一个请求来解决这个问题。
您最终可以尝试从语言选择器中创建一个常规 用户控件 并注册它,尽管我不完全确定它是否有帮助。我知道一些 Kentico 默认转换确实在注册用户控件,因此在某些情况下可能会有所帮助。
一般来说,尽可能避免在转换中使用用户控件。我建议您只将语言选择器 Web 部件放在转换之外,这将是无需任何其他调整即可使其正常工作的最简单方法。
更新:
在与 Kentico 团队交谈后,注释 here 已更改为:
以反映当前状态We do NOT recommend using web parts within the code of transformations. This could lead to poor performance and certain web parts may not work correctly within transformations due to their life cycle.
我同意 Enn 的观点,转发器控件的生命周期可能有问题,因为它是动态添加到页面中的。 您是否尝试过使用 CMSRepeater 控件而不是 BasicRepater 和 DelayedLoading 属性设置为 true?
问题是您的数据源没有返回任何数据。
如果您不需要在转换中动态生成数据源的属性,我建议您将语言数据源 Web 部件放在它工作正常的页面上,并在转型.
语言数据源 Web 部件可能缺少上下文中的某些内容。在内部,DS 的 Node
属性 使用 DocumentContext.CurrentDocument
,这在转换中可能不可用。这要么是这个,要么是 Enn 所说的关于具有不同周期的控件。
另一种选择是将自定义 C# 代码放在 <% %>
括号内并以编程方式检索您需要的数据。