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

时间:2015-11-16 06:01:14

标签: c# kentico

我有一个“促销”小部件,它包含内置的通用页面查看器Web部件。编辑可以将促销小部件添加到他们的页面,以便链接到站点中的任何其他页面。他们添加的促销小部件将使用链接页面的名称和该页面的预告图像进行渲染。

窗口小部件配置为显示路径字段,以便编辑器可以选择他们正在推广的页面,并将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

e.g。 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个列名的列表似乎非常难看。

1 个答案:

答案 0 :(得分:4)

我认为每页类型的特定转换会更容易。您可以使用相同的代码进行转换,例如促销并为每种页面类型进行此转换。在窗口小部件/ Web部件的设置中,您将通过宏初始化属性。宏将只是获取显示的页面类型代码名称。给定属性的默认值可能类似于:

{%my_macro_to_get_page_type_code_name%}.promo

我认为您也可以通过标准的K#语言获取代码名称,但我个人还没有这样做。另一种方法是使用自定义表单控件,可以根据需要进行初始化。