1

我在 VBScript 中有以下代码

' Retrieve the keyword category for page section names
Set SectionCat = TDSE.GetObject(WebdavToUri(getPublicationWebDav(WEBDAV_SECTION_CAT)), 1)
' Retrieve the localized section keyword
Set SectionKeyword = SectionCat.GetKeywordByTitle(meta)

' Open the English translated section keyword
Set SectionKeyword = TDSE.GetObject(SectionKeyword.Id, 1, WEBDAV_UKEN_PUB)

SectionName = SectionKeyword.Title

其中WEBDAV_UKEN_PUB是 WebDavPath,现在在 VBScript GetObject 方法中,我们可以选择传递三个参数:1) Item.ID、2) TDSDefines.OpenModeEditWithFallback 和 3) WebDavPath 从何处制作对象。

现在我想在 2009 .Net 模板中编写相同的逻辑,下面是示例代码,我正在尝试编写但无法摆脱 VBScript 对象。

Category cat = engine.GetSession().GetObject(WebdavToUri(getPublicationWebDav(Constants.WEBDAV_SECTION_CAT,package,engine), engine)) as Category;
if (cat != null)
{
//_log.Info("Category" + cat.Title);
Keyword keyword = cat.GetKeywordByTitle(meta);
//_log.Info("keyword 1" + keyword.Title);

keyword = engine.GetObject(Constants.WEBDAV_UKEN_PUB) as Keyword;

//_log.Info("keyword 2 " + keyword.Title);
if (keyword != null)
{
sectionName = keyword.Title;
}
keyword = null;

我能够创建 Category 对象,但是当我试图使 Keyword 对象失败并给出对象引用错误时。

我们是否有任何类或方法与 VBScript GetObject 一样工作,它将从传递的 webdavpath 生成对象,或者有人可以提供示例代码。

4

2 回答 2

2

我认为你的问题在这里:

keyword = engine.GetObject(Constants.WEBDAV_UKEN_PUB) as Keyword;

您正在使用出版物的 WEBDav URL,然后尝试动态转换为关键字。您不能将发布转换为关键字,因此转换失败并且您的关键字变量被分配为空。

以这种方式使用动态转换是一种欺骗自己的简单方法。当您在编译时不知道您期望什么类型时,应该使用“As”关键字(C# 关键字而不是 Tridion 关键字)。如果你知道你需要一个关键字类型的项目,那么你应该写:

keyword = (Keyword)engine.GetObject(Constants.WEBDAV_UKEN_PUB);

这样 - 当转换失败时,您将得到一个正确识别问题的异常。

于 2011-10-12T18:49:47.150 回答
1

在 TOM.NET 中,我们无法获取对象并指定从哪个 pub 读取它,我们需要将 TcmUri 修改为在上下文中。

所以:

Repository context = (Repository)session.GetObject(WEBDAV_UKEN_PUB);
TcmUri keywordInContext = new TcmUri(keyword.Id.ItemId, keyword.Id.ItemType, context.Id.ItemId);
Keyword keyword = (Keyword)session.GetObject(keywordInContext);
于 2011-10-12T04:20:51.693 回答