#tridion
#tridion
Вопрос:
У меня есть приведенный ниже код в 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, теперь в методе GetObject VBScript у нас есть возможность передать три параметра: 1) Элемент.Идентификатор, 2) TDSDefines.Откройте modeeditwithfallback и 3) WebDavPath, из которого нужно создать объект.
Теперь я хочу написать ту же логику в шаблонах .Net 2009, ниже приведен пример кода, который я пытаюсь написать, но не могу избавиться от объекта 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;
Я могу создать объект категории, однако, когда я пытаюсь создать объект ключевого слова, его получение не удалось и выдает ошибку ссылки на объект.
Есть ли у нас какой-либо класс или метод, который работает так же, как VBScript GetObject, который создаст объект из переданного webdavpath, или кто-нибудь может дать пример кода для этого.
Ответ №1:
Я думаю, что ваша проблема здесь:
keyword = engine.GetObject(Constants.WEBDAV_UKEN_PUB) as Keyword;
Вы используете URL-адрес WebDAV публикации, а затем пытаетесь выполнить динамическое приведение к ключевому слову. Вы не можете привести публикацию к ключевому слову, поэтому приведение завершается неудачно, и вашей переменной ключевого слова присваивается значение null.
Использование динамических приведений таким образом — простой способ обмануть себя. Ключевое слово «As» (ключевое слово C #, а не ключевое слово Tridion) следует использовать, когда во время компиляции вы не знаете, какой тип вы ожидаете. Если вы знаете, что ожидаете получить элемент типа Keyword, то вам следует написать:
keyword = (Keyword)engine.GetObject(Constants.WEBDAV_UKEN_PUB);
Таким образом, при сбое приведения вы получите исключение, которое правильно идентифицирует проблему.
Ответ №2:
В TOM.NET мы не можем получить объект и указать, из какого паба его читать, нам нужно изменить 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);