Tridion 在基于.net的CT中访问组件的容器页

Tridion 在基于.net的CT中访问组件的容器页,tridion,tridion-2011,Tridion,Tridion 2011,我们正在开发基于代理查询机制(筛选器)的基于.net的CT: 为了传递页面ID,我需要获得组件所在页面的访问权限。 如何从软件包访问页面?因为这是一个CT,所以在页面中可以使用组件对象,而不是页面对象。 尝试了以下代码,但未成功: string pageURI = _package.GetValue("Page.ID"); Page objPage = (Page)_engine.GetSession().GetObject(pageURI); 这不起作用,因为没有页面对象。为了从CT访问组件

我们正在开发基于代理查询机制(筛选器)的基于.net的CT:

为了传递页面ID,我需要获得组件所在页面的访问权限。 如何从软件包访问页面?因为这是一个CT,所以在页面中可以使用组件对象,而不是页面对象。 尝试了以下代码,但未成功:

string pageURI = _package.GetValue("Page.ID");
Page objPage = (Page)_engine.GetSession().GetObject(pageURI);

这不起作用,因为没有页面对象。为了从CT访问组件的父页面,有哪些替代方案?

为了解决这个问题,我创建了一个AddPageToComponentPresentation TBB。代码如下:

使用系统;
使用System.Collections.Generic;
使用系统文本;
使用Tridion.ContentManager;
使用Tridion.ContentManager.Templating;
使用Tridion.ContentManager.Templating.Assembly;
命名空间Tridion.Extensions.ContentManager.Templateing{
[TcmTemplateTitle(“将页面添加到组件演示文稿”)]
类AddPageToComponentPresentation:TemplateBase{
公共覆盖无效转换(引擎、包){
if(engine.PublishingContext.RenderContext.ContextItem!=null){
Item pageItem=package.CreateTridionItem(ContentType.Page,engine.PublishingContext.RenderContext.ContextItem.Id);
包装。PushItem(“第页”,第页项目);
调试(“添加到包中的页面项”);
}否则{
Debug(“未找到上下文项”);
}
}
}
}
非常感谢杰里米。 我尝试了这段代码,但无法使用接口TemplateBase

根据您代码中的提示,我尝试了

Page page = _engine.PublishingContext.RenderContext.ContextItem as Page;
这很有效。此外,我还可以将发布对象设置为:

Publication pub = (Publication)page.ContextRepository;

非常感谢。

这是一个不错的解决方案,但现在您必须小心处理所有其他TBB,因为通过检查包中是否有可用的页面对象来确定TBB是否在组件模板上下文中运行是很常见的,没有它通常会告诉你你在CT中,而存在则会告诉你你在PT中。我从来没有看到过检查自己(不是说这表明什么),但在那种情况下它会产生影响。我想一个选项是更改创建的项目的名称。TemplateBase接口是Templateing base项目的一部分:哦,对不起。我猜,在缺少TemplateBase类的情况下,应该改为ITemplate;)Mihai在这里建议的方法是什么:错误的链接,我的意思是:
Publication pub = (Publication)page.ContextRepository;