Как переопределить метод GetObject VBScript в .NET

#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);