Как переопределить метод GetObject VBScript в .NET - PullRequest
0 голосов
/ 11 октября 2011

У меня ниже код в 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, который сделает объект из переданного веб-пути, или может кто-нибудь дать пример кода на этом.

Ответы [ 2 ]

2 голосов
/ 12 октября 2011

Я думаю, что ваша проблема здесь:

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

Вы используете URL-адрес публикации WEBDav, а затем пытаетесь выполнить динамическое приведение к ключевому слову. Вы не можете привести публикацию к ключевому слову, поэтому приведение не выполняется, и вашей ключевой переменной присваивается значение null.

Использование динамических приведений таким способом - простой способ обмануть себя. Ключевое слово «As» (ключевое слово C #, а не ключевое слово Tridion) следует использовать, когда во время компиляции вы не знаете, какой тип вы ожидаете. Если вы знаете, что ожидаете предмет типа Keyword, то вам следует написать:

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

Таким образом - когда произойдет сбой приведения, вы получите исключение, которое правильно идентифицирует проблему.

1 голос
/ 12 октября 2011

В 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);
...