2012-04-04 322 views
3

我创建了一个事件接收器来处理一个文档库中的ItemAdded和ItemUpdating事件在SharePoint 2010ItemUpdating事件接收器ItemAdded后叫了两声

我遇到一个问题,当我添加一个文件该库(例如通过将其从Word中保存)正确调用ItemAdded方法,但随后会对ItemUpdating执行两次调用。我已经从我的处理程序中删除了所有代码,以确保它不是我在里面造成问题的东西。他们字面上看起来像:

public override void ItemUpdating(SPItemEventProperties properties) 
{ 
} 

public override void ItemAdded(SPItemEventProperties properties) 
{ 
} 

有没有人有解决这个问题?

这里是事件接收我的Elements.xml文件:

<Elements xmlns="http://schemas.microsoft.com/sharepoint/"> 
    <Receivers ListTemplateId="101"> 
     <Receiver> 
     <Name>DocumentsEventReceiverItemUpdating</Name> 
     <Type>ItemUpdating</Type> 
     <Assembly>$SharePoint.Project.AssemblyFullName$</Assembly> 
     <Class>My.Namespace.DocumentsEventReceiver</Class> 
     <SequenceNumber>10000</SequenceNumber> 
     <Synchronization>Synchronous</Synchronization> 
     </Receiver> 
     <Receiver> 
     <Name>DocumentsEventReceiverItemAdded</Name> 
     <Type>ItemAdded</Type> 
     <Assembly>$SharePoint.Project.AssemblyFullName$</Assembly> 
     <Class>My.Namespace.DocumentsEventReceiver</Class> 
     <SequenceNumber>10000</SequenceNumber> 
     <Synchronization>Synchronous</Synchronization> 
     </Receiver> 
    </Receivers> 
</Elements> 

回答

7

问题是,在期间Item UpdatingDocument library事件处理程序也检查Document是在入住模式或离店。这就是为什么它被调用两次。

你应该把你的代码

public override void ItemUpdating(SPItemEventProperties properties) 
    { 
    base.ItemUpdating(properties); 
    if (properties.AfterProperties["vti_sourcecontrolcheckedoutby"] == null && properties.BeforeProperties["vti_sourcecontrolcheckedoutby"] != null) 
    { 
     //do stuff 
    } 
    } 

详情Here是好文章,描述了Document's事件的整个情况。

+0

我的if语句与您的语句不完全相同,但我可以使用您提到的字段。在我的实际更新期间,vti_sourcecontrolcheckedoutby的前后属性始终为空,所以我可以检查它。在ItemAdded后调用ItemUpdating时,两者都填充了我的用户名 – Jason 2012-04-05 08:12:52

+0

ok.finally现在是否解决了您的问题? – Jigs 2012-04-05 08:26:14

+0

是的谢谢! ItemUpdating仍然会触发,但if语句让我确定是否真的运行我的代码 – Jason 2012-04-05 09:49:17