2012-07-02 3 views
4

Я работаю над .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) 
+0

Вы пытались проверить, существует ли поле, прежде чем пытаться применить его к EmbeddedSchemaField? Подобно этому - if (content.Contains (field.Name)) {// что-то делать} –

+0

Я пробовал то, что вы предложили, и произошло очень любопытное. Я положил if-loop сразу после c loginfo и добавил log.info сразу после цикла if и добавил сообщение else, если поле не было названо. шаблон сломался прямо перед этим, по умолчанию, потому что не из сообщений, которые действительно срабатывали, кроме _log.Info («c ...»), и прямо сейчас я считаю, что «ItemFields content = new ItemFields (c.Content, c. Схема);» может быть гаечным ключом в работах. Объяснит также сообщение «новый элемент». – MDa

+0

Интересно. Вы можете отлаживать шаблон в Visual Studio? Журналирование не предполагает, но я считаю, что это даст большую ясность, если можно. –

ответ

2

Я хотел бы сделать следующее:

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

    if (content != null && content.Contains(field.Name)) { 
     EmbeddedSchemaField embeddedFields = (EmbeddedSchemaField)content[field.Name]; //boom 

     MultimediaLinkField mmValue = null; 

     ItemFields currentFields = null; 

     foreach (ItemFields embeddedField in embeddedFields.Values) 
     { 

Обратите внимание на добавленный чеке, что объект ItemFields создаются, и что она содержит поле, которое вы ищете.

Смежные вопросы