【问题标题】:Accessing properties of TOM.NET objects when passing them between methods after GetItems(filter) call在 GetItems(filter) 调用之后在方法之间传递它们时访问 TOM.NET 对象的属性
【发布时间】:2012-10-25 15:03:33
【问题描述】:

在使用 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() 方法出了点问题,它没有返回完整的对象,并且一旦将部分加载的对象传递给 next 方法,它就无法像原来一样加载属性参考丢失。

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

谢谢

【问题讨论】:

    标签: tridion tridion-2011


    【解决方案1】:

    这看起来很奇怪——事实上我无法在 2011 GA 上重现——我将你的函数粘贴到 .NET TBB 中并从模板生成器中执行——这两种方法都可以很好地输出目录。这可能不会像纯粹的猜测一样起作用,但可以尝试以下几点:

    1. filter.BaseColumns = ListBaseColumns.Extended - 我认为这仅适用于 GetListItems,但你永远不知道...
    2. 尝试输出 sg.LoadState 以查看其是否未完全加载

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-27
        • 1970-01-01
        • 2011-08-03
        • 1970-01-01
        • 2017-08-03
        • 1970-01-01
        相关资源
        最近更新 更多