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

Tridion 在GetItems(filter)调用后在方法之间传递TOM.NET对象的属性时访问它们,tridion,tridion-2011,Tridion,Tridion 2011,当使用GetItems方法并将返回集合中的每个项传递给另一个方法时,我们面临一个奇怪的问题 我们是2011年美国佐治亚州的Tridion 以下代码正在被破坏: private void foo(StructureGroup structureGroup, Session session, int counterTemp, int levels) { OrganizationalItemItemsFilter filtersg= new OrganizationalItemItemsFil

当使用GetItems方法并将返回集合中的每个项传递给另一个方法时,我们面临一个奇怪的问题

我们是2011年美国佐治亚州的Tridion

以下代码正在被破坏:

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 !?
}
private void foo(StructureGroup StructureGroup,Session Session,int counterTemp,int levels)
{
OrganizationalEmitmSfilter filtersg=新的OrganizationalEmitmSfilter(会话);
filtersg.Recursive=false;
IEnumerable itemtype=新列表{itemtype.StructureGroup};
filtersg.ItemTypes=itemtype;
foreach(StructureGroup.GetItems(filtersg)中的StructureGroup sg)
{
获取站点地图(sg、计数器温度、级别);
}
}
私有void GetSiteMap(结构组sg、整型计数器、整型级别)
{
logger.Info(sg.Id);//确定
logger.Info(sg.Title);//确定
logger.Info(sg.Directory);//null!?
}
但是,如果sg.目录在将sg传递到下一个方法之前是access,那么所有这些都可以正常工作:

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   }
}
private void foo(StructureGroup StructureGroup,Session Session,int counterTemp,int levels)
OrganizationalEmitmSfilter filtersg=新的OrganizationalEmitmSfilter(会话);
filtersg.Recursive=false;
IEnumerable itemtype=新列表{itemtype.StructureGroup};
filtersg.ItemTypes=itemtype;
foreach(StructureGroup.GetItems(filtersg)中的StructureGroup sg)
{
logger.Info(sg.Directory);//如果在此处打印,则所有操作都可以正常进行。
获取站点地图(sg、计数器温度、级别);
}
}
私有void GetSiteMap(结构组sg、整型计数器、整型级别)
{
logger.Info(sg.Id);//确定
logger.Info(sg.Title);//确定
logger.Info(sg.Directory);//ok}
}
它感觉GetItems()方法发生了一些事情,它没有返回完整的对象,并且一旦将部分加载的对象传递给下一个方法,它就不能像丢失原始引用一样加载属性

有人能解释一下这里发生了什么吗?另外,在方法之间传递TOM.NET对象是否不好


谢谢这看起来很奇怪-事实上我无法在2011年GA上复制-我将您的函数粘贴到.NET TBB中并从模板生成器执行-这两种方法都可以很好地输出目录。这可能不是纯粹的猜测,但有几件事需要尝试:

  • filter.BaseColumns=ListBaseColumns.Extended
    -我想这只是针对GetListItems的,但你永远不知道
  • 尝试输出
    sg.LoadState
    以查看其是否未完全加载

  • 如果所有其他操作都失败,请使用
    GetListItems
    ,然后为要处理的每个项目创建一个StructureGroup对象(假定您将根据sg.Title从站点地图中跳过一些sg)。有点遗憾的是,从GetListItems返回的数据没有url属性,否则您可以使用
    Publication.GetListItems()
    ,使用仅用于SGs(或SGs和页面)的递归过滤器一次性完成所有操作。

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