Tridion RepositoryLocalObject.GetBluePrintChain方法(BluePrintChainFilter)thows共享项异常

Tridion RepositoryLocalObject.GetBluePrintChain方法(BluePrintChainFilter)thows共享项异常,tridion,tridion-2011,Tridion,Tridion 2011,我试图获取RepositoryLocalObject(例如组件)继承自的父项列表。因此,如果我有一个包含组件tcm:1-80的发布ID 1和一个子发布ID 2,那么这个组件在子发布中作为tcm:2-80共享。所以我想让tcm:2-80的父母,或者树上的任何东西向上移动 我在一个组件的本地副本上尝试了GetBluePrintChain()方法,该方法运行良好。然而,在共享组件上,它返回一个InvalidActionException:“此项是共享的”。文档提到此异常是在共享项上引发的。但这有什么意

我试图获取RepositoryLocalObject(例如组件)继承自的父项列表。因此,如果我有一个包含组件tcm:1-80的发布ID 1和一个子发布ID 2,那么这个组件在子发布中作为tcm:2-80共享。所以我想让tcm:2-80的父母,或者树上的任何东西向上移动

我在一个组件的本地副本上尝试了GetBluePrintChain()方法,该方法运行良好。然而,在共享组件上,它返回一个InvalidActionException:“此项是共享的”。文档提到此异常是在共享项上引发的。但这有什么意义呢?很明显,如果任何项目的蓝图链超出其自身范围,则该项目将被共享(或是本地副本)。所以对我来说,让这个方法在有蓝图链的东西上抛出异常是没有意义的。这似乎自相矛盾


我的问题有点像,但不同。我需要理解为什么在共享项上引发此异常。有人能解释一下或者分享一个用例来支持它吗?

据我所知,
GetBluePrintChain
方法是用来在你站在蓝图顶端时向下看蓝图的。因此,在您的情况下,您应该在其所属的发布上下文中获取该项,然后调用
GetBluePrintChain

Item=package.GetByName(“组件”);
组件组件=新组件(item.GetAsXmlDocument().DocumentElement,
engine.GetSession());
TcmUri id=TemplateUtilities.CreateTcmUriForPublication(
component.OwningRepository.Id.ItemId,component.Id);
var blueprintchain=((组件)engine.GetObject(id)).GetBluePrintChain();
package.PushItem(package.CreateStringItem(ContentType.Text,
blueprintchain.ToString());
package.PushItem(package.CreateStringItem(ContentType.Text,
“”+System.Linq.Enumerable.Count(blueprintchain));
foreach(蓝图链中的var项目)
{
package.PushItem(package.CreateTridionItem(ContentType.Component,item));
}
我只是在两种情况下将上述C#片段作为TBB运行:

  • 在共享组件上的子出版物中
  • 在本地化组件上的子出版物中

  • 在案例1中,
    blueprintchain
    将包含一个项目:共享组件。在案例2中,
    blueprintchain
    将包含两个项目:共享组件和本地化组件。

    为了总结上述答案,下面是一个关于“项目是共享的”问题的实用解决方案:

    为恰好共享的任意项目调用GetBluePrintChain()将失败:

    返回
    item.GetBluePrintChain(
    新BluePrintChainFilter(
    蓝图,向上,
    engine.GetSession()
    )
    ).LastOrDefault();
    
    解决方案是根据Frank的配方首先找到最顶级本地化项目的父项:

    返回
    ((RepositoryLocalObject)引擎
    .GetObject(
    TemplateUtilities.CreateTcmUriForPublication(
    item.OwningRepository.Id.ItemId,
    项目Id
    )
    )
    ).GetBluePrintChain(
    新BluePrintChainFilter(
    蓝图,向上,
    engine.GetSession()
    )
    ).LastOrDefault();
    
    ah,但如果指定过滤器,则可以设置向上或向下的方向。因此,我希望能够获取一个共享项并将该链放到树上:BluePrintChainFilter bpfilter=new BluePrintChainFilter(BluePrintChainDirection.up,engine.GetSession());项目可以在当前上下文存储库中进行本地化,在这种情况下,您可以向上或向下查找,并在筛选器中指定方向。无论哪种方式,您似乎只能在项目所属存储库的上下文中访问项目的蓝图链。