4

我一直在研究 .NET C# TBB 以从模式中检索字段,而模式又会解析每个嵌入的字段。我在模板中使用 Razor Mediator 来输出 JSON。我对 C# 和 .NET 非常陌生,因此我使用和引用我的同事在其他模板中编写的代码。TBB 的目标是在发布后检索这些嵌入字段之一中图像的确切 url ,并将其作为纯文本推回包中。

这最终似乎奏效了,直到我将嵌入式模式的一个字段更改为多媒体链接。一旦我将 Embeddedschemafields 设置为循环遍历,模板生成器就会提供一个带有 o 描述性的错误

Operation is not supported on a new item or on a null URI.

我不知道为什么会这样,因为代码确实有效。这就是为什么我认为更改嵌入式模式的一个字段可能是罪魁祸首,但错误甚至在查找此特定字段之前就发生了。我的代码停止从 Embeddedschemafield 检索组件:

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

1 回答 1

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 对象是否已创建,并且它包含您要查找的字段。

于 2012-07-02T12:20:59.523 回答