如何编写转换以支持许多不同的页面类型

本文关键字:类型 许多不 何编写 转换 支持 | 更新日期: 2023-09-27 18:22:12

我有一个"promo"小部件,它封装了内置的通用页面查看器web部件。编辑可以在他们的页面上添加促销小部件,以便链接到网站中的任何其他页面。他们添加的促销小部件将显示链接页面的名称和该页面的摘要图像。

该小部件被配置为显示Path字段,以便编辑器可以选择他们正在推广的页面,并且TransformationName字段的默认值设置为"CMS.MenuItem.Promo"。TransformationName字段被标记为不可编辑。

我真的希望编辑器能够将他们的促销小部件指向网站中的任何页面,而不必担心他们指向的节点类型,所以我希望CMS.MenuItem.promo转换支持任何页面类型。

我的想法是添加一种自定义转换方法,如:

namespace CMS.Controls
{
    public partial class CMSTransformation
    {
        public string GetTeaser()
        {
            TreeNode node = this.get_the_current_node_somehow...();
            Page page = new PageFactory().GetPage(node);
            return page.GetTeaserRelativeURL();
        }

然后我可以在转换中包括以下内容,编辑器不需要关心它们有什么类型的节点:

<img src="<%# GetTeaser() %>" />

我已经设置并运行了PageFactory(它被其他代码使用)——它所做的只是打开node.ClassName并返回一个新的Page对象:

public Page GetPage(TreeNode node)
{
    switch (node.ClassName)
    {
        case CMS_Event.PageType:
            return new CMS_Event(node);
        case CMS_MenuItem.PageType:
            return new CMS_MenuItem(node);
        // etc

例如CMS_MenuItem只是:

public class CMS_MenuItem : Page
{
    public const string TeaserField = "MenuItemTeaserImage";
    private readonly TreeNode node;
    public CMS_MenuItem(TreeNode node)
    {
        this.node = node;
    }
    public override string GetTeaserRelativeURL()
    {
        var guid = node.GetValue<Guid>(TeaserField, Guid.Empty);
        return AttachmentURLProvider.GetAttachmentUrl(guid, node.NodeAlias);
    }

是否可以在转换方法中获取TreeNode对象?如果是这样的话,我可以使用我现有的代码来获得预告图,而不管我有什么类型的节点。

如果在转换方法中无法获得TreeNode,那么无论当前页面类型如何,获得字段的最干净方法是什么?

我知道GetNotEmpty()GetColumnName()的转换方法,但每次尝试取出字段时都必须传递一个包含12个列名的列表,这似乎很难看。

如何编写转换以支持许多不同的页面类型

我认为按页面类型进行特定转换会更容易。你可以用相同的代码进行转换,例如Promo,并对每个页面类型进行转换。在小部件/web部件的设置中,您可以通过宏初始化属性。宏只需获取显示的页面类型代码名称。给定属性的默认值可能类似于:

{%my_macro_to_get_page_type_code_name%}.promo

我想你也可以通过标准的K#语言获得代码名称,但我个人还没有这样做。另一种选择是使用自定义表单控件,该控件可以根据您的喜好进行初始化。