如何编写转换以支持许多不同的页面类型
本文关键字:类型 许多不 何编写 转换 支持 | 更新日期: 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#语言获得代码名称,但我个人还没有这样做。另一种选择是使用自定义表单控件,该控件可以根据您的喜好进行初始化。