2012-04-04 323 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