在GetItems(过滤器)调用之后在方法之间传递TOM.NET对象的属性时访问它们

时间:2012-10-25 15:03:33

标签: tridion tridion-2011

使用GetItems方法并将返回集合中的每个项目传递给另一个方法时,我们遇到了一个奇怪的问题。

我们正在参加Tridion 2011 GA。

以下代码正在破碎:

private void foo(StructureGroup structureGroup, Session session, int counterTemp, int levels)
{
    OrganizationalItemItemsFilter filtersg= new OrganizationalItemItemsFilter(session);
    filtersg.Recursive = false;
    IEnumerable<ItemType> itemtype = new List<ItemType> { ItemType.StructureGroup};
    filtersg.ItemTypes = itemtype;

    foreach (StructureGroup sg in structureGroup.GetItems(filtersg))
    {
        GetSiteMap(sg, counterTemp, levels);
    }
}

private void GetSiteMap(StructureGroup sg, int counter, int levels)
{
    logger.Info(sg.Id);  //ok
    logger.Info(sg.Title);  //ok
    logger.Info(sg.Directory);  // null !?
}

但是,如果在将sg传递给下一个方法之前sg.Directory是访问权限,那么一切正常:

private void foo(StructureGroup structureGroup, Session session, int counterTemp, int levels)
    OrganizationalItemItemsFilter filtersg= new OrganizationalItemItemsFilter(session);
    filtersg.Recursive = false;
    IEnumerable<ItemType> itemtype = new List<ItemType> { ItemType.StructureGroup};
    filtersg.ItemTypes = itemtype;

    foreach (StructureGroup sg in structureGroup.GetItems(filtersg))
    {
        logger.Info(sg.Directory); //if printed here, all works fine down the line.
        GetSiteMap(sg, counterTemp, levels);
    }
}

private void GetSiteMap(StructureGroup sg, int counter, int levels)
{
    logger.Info(sg.Id);  //ok
    logger.Info(sg.Title);  //ok
    logger.Info(sg.Directory);  // ok   }
}

感觉GetItems()方法发生了一些事情,它没有返回完整的对象,并且一旦将部分加载的对象传递给下一个方法,它就无法加载属性,就像原始对象一样参考丢失了。

有人可以了解这里发生的事情吗?另外,在方法之间传递TOM.NET对象是不是很糟糕?

由于

2 个答案:

答案 0 :(得分:2)

这看起来很奇怪 - 实际上我无法在2011 GA上重现 - 我将您的功能粘贴到.NET TBB并从模板构建器执行 - 两种方法都输出目录就好了。这可能不会像纯粹的猜测那样起作用,但有几件事要尝试:

  1. filter.BaseColumns = ListBaseColumns.Extended - 我认为这只适用于GetListItems,但你永远不会知道......
  2. 尝试输出sg.LoadState以查看它是否以某种方式未完全加载
  3. 如果所有其他方法都失败了,请使用GetListItems,然后为要处理的每个项目创建一个StructureGroup对象(假设您将基于sg.Title跳过站点地图中的某些SG)。遗憾的是,GetListItems返回的数据没有url属性,否则你可以使用Publication.GetListItems()一次性完成所有操作,只使用SGs(或SGs和Pages)的递归过滤器。 / p>

答案 1 :(得分:2)

如果Will的建议不起作用,你总是可以尝试将SG类变量作为缓冲区,为循环中的每个项设置,然后只需调用方法GetSiteMap而不传递sg。不是最干净的解决方案,但如果没有别的办法,那就值得一试。