2011-05-26 55 views
3

在我的Sitecore的6.1.0安装我已经挂在几个孤儿项目“添加项目”:Sitecore的增加每当一个项目添加

<event name="item:added"> 
    <handler type="Sitecore.Data.Fields.ItemEventHandler, Sitecore.Kernel" method="OnItemAdded" /> 
    <handler type="my.project.Classes.OnSaveItemHandler, my.project" method="OnItemAdded" /> 
    </event> 

这样做的目的是强制唯一名称的项目 - 换句话说,在我OnItemAdded方法我想任何其他项目具有相同的名称做了Lucene搜索作为要添加的项目。

每次在Sitecore结构中添加项目时,都会调用OnItemAdded方法。但我的问题是 - 该方法被称为不止一次每个项目。我已经看到它调用的每个添加项目的时间在6到26次之间,具体取决于Sitecore结构添加项目的位置。我OnItemAdded法的主体是空的:

protected void OnItemAdded(object obj, EventArgs args) 
    { 
    } 

第一次当加入一个项目的方法被调用,在args参数的项目是正确的项目。如果该项目的名称为theItemName,在FULLPATH属性将是这样的:

/sitecore/content/theItemName 

不同的是第一个,每次,该项目看起来正确的,但该项目的路径是这样的:

[orphan]/sitecore/content/theItemName 

为什么[orphan]位被添加到完整路径上?为什么OnItemAdded方法被多次调用,即使我只添加一个项目?

+0

这是bizzare。也许用support.sitecore.net创建一张票。 – marto 2011-05-26 16:22:50

回答

3

我相信有一些事件的已知问题喜欢这个方法将被调用多次。我知道我有一个类似的经历,我试图在项目创建时以编程方式为项目创建角色。 John West said the following as a precaution

我似乎记得Sitecore的触发有时不止一次一些事件,所以你可能要检查的是[...]

约翰然后提供一个链接到一个博客文章所谓Intercepting Item Updates with Sitecore

在我的代码,我有一个检查检查,看看是否已经发生了我一直在寻找的操作,例如该项目的角色是否存在?在你的情况下,这可能有点难以检查该方法。也许你可以做一些事情偷偷摸摸像:

protected void OnItemAdded(object obj, EventArgs args) { 
    Item item = // code to extract item from args, I forgot it 

    if(item.Paths.FullPath.StartsWith("/sitecore/content")) { 
    // do your stuff because you know its the first time the event fired 
    } 
} 

再次,这是非常的hackish。如果Sitecore支持不能提供更好的选择(或者没有任何更好的选项发布在Stack overflow上),我会说这是最后的手段。

0

我有同样的问题,貌似这个问题涉及到代理的项目。

我会添加一个项目,然后得到很多[孤儿]路径,并且每个创建的项目都会有不同的ID。

关闭代理项目会停止正在创建的[孤立]项目。

编辑 - 发现阴影表已损坏, 截断阴影表在master数据库中,并截断核心链接数据库,然后重新编译链接数据库。 我收到了这些孤儿记录中的46个项目,这些项目并不意味着要在其上设置代理项目。