我在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创建Object,或者有人可以为此提供示例代码。
答案 0 :(得分:2)
我认为你的问题在这里:
keyword = engine.GetObject(Constants.WEBDAV_UKEN_PUB) as Keyword;
您正在使用发布的WEBDav URL,然后尝试动态转换为关键字。您无法将发布转换为关键字,因此转换失败并且您的关键字变量被指定为null。
以这种方式使用动态强制转换是一种欺骗自己的简单方法。当您在编译时不知道您期望的类型时,应使用“As”关键字(C#关键字而不是Tridion关键字)。如果你知道你期望一个Keyword类型的项目,那么你应该写:
keyword = (Keyword)engine.GetObject(Constants.WEBDAV_UKEN_PUB);
这种方式 - 当转换失败时,您将获得一个正确识别问题的异常。
答案 1 :(得分: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);