Я работаю над .NET C# TBB для извлечения полей из схемы, которая по очереди анализирует каждое встроенное поле. Я использую Razor Mediator в своих шаблонах для вывода JSON. Я очень новичок в C# и .NET, поэтому я использую и ссылаюсь на код, который мои коллеги писали в других шаблонах. Цель TBB - получить после публикации точный URL-адрес изображения в одном из этих встроенных полей , и верните его обратно в пакет как обычный текст.Извлечение компонента из ошибки Embeddedschemafield в .NET.
В конечном итоге это сработало, пока я не изменил одно из полей встроенной схемы на мультимедиалинк. Как только я установил Embeddedschemafields перебрать, конструктор шаблонов служит ошибка с O так описательной
Operation is not supported on a new item or on a null URI.
Я понятия не имею, почему это происходит, так как на самом деле код работал. Вот почему я считаю, что изменение одного из полей внедренной схемы может быть преступником, но ошибка возникает даже перед тем, как просмотреть это конкретное поле. мой код останавливается при извлечении компонента из встроенного экрана:
CM.Schema schema = (engine.GetObject(comp.GetAsSource().GetValue("ID")) as CM.Component).Schema;
ItemFields fields = new ItemFields(schema);
foreach (ItemField field in fields)
{
_log.Info("top level: " + field.Name);
if (field is EmbeddedSchemaField)
{
CM.Component c = (CM.Component)engine.GetObject(package.GetByName(Package.ComponentName));
_log.Info(" c = " + c + " content: " + c.Content + " schema: " + c.Schema);
ItemFields content = new ItemFields(c.Content, c.Schema);
EmbeddedSchemaField embeddedFields = (EmbeddedSchemaField)content[field.Name]; //boom
MultimediaLinkField mmValue = null;
ItemFields currentFields = null;
foreach (ItemFields embeddedField in embeddedFields.Values)
{
У кого-нибудь есть идея?
Это журнал я получил от шаблона строителя:
GetComponentImageUrl: top level: name
GetComponentImageUrl: top level: division
GetComponentImageUrl: top level: theme
GetComponentImageUrl: top level: product
GetComponentImageUrl: field.Name = Embeddedschemafield
GetComponentImageUrl: c = Component tcm:11-1963 content: System.Xml.XmlElement schema: Schema tcm:11-1842-8
GetComponentImageUrl: c. Content = System.Xml.XmlElement
Engine: Error in Engine.Transform
Engine: Error in Engine.Transform
Operation is not supported on a new item or on a null URI.
at Tridion.ContentManager.Session.GetTcmUri(String uri)
at Tridion.ContentManager.Session.GetObject(String uri)
at Tridion.ContentManager.Session.GetObject(XmlElement linkElement)
Вы пытались проверить, существует ли поле, прежде чем пытаться применить его к EmbeddedSchemaField? Подобно этому - if (content.Contains (field.Name)) {// что-то делать} –
Я пробовал то, что вы предложили, и произошло очень любопытное. Я положил if-loop сразу после c loginfo и добавил log.info сразу после цикла if и добавил сообщение else, если поле не было названо. шаблон сломался прямо перед этим, по умолчанию, потому что не из сообщений, которые действительно срабатывали, кроме _log.Info («c ...»), и прямо сейчас я считаю, что «ItemFields content = new ItemFields (c.Content, c. Схема);» может быть гаечным ключом в работах. Объяснит также сообщение «новый элемент». – MDa
Интересно. Вы можете отлаживать шаблон в Visual Studio? Журналирование не предполагает, но я считаю, что это даст большую ясность, если можно. –