ItemUpdating在事件接收器中的ItemAdded之后调用两次

Jas*_*son 3 sharepoint-2010

我创建了一个事件接收器来处理SharePoint 2010中文档库上的ItemAdded和ItemUpdating事件.

我遇到了一个问题,当我向库中添加文档时(例如,通过将其保存回Word),正确调用了ItemAdded方法,然后调用了两次ItemUpdating.我已从处理程序中删除了所有代码,以确保它不是我正在做的内容导致问题.它们看起来像:

public override void ItemUpdating(SPItemEventProperties properties)
{
}

public override void ItemAdded(SPItemEventProperties properties)
{
}
Run Code Online (Sandbox Code Playgroud)

有没有人有这个问题的解决方案?

这是我的事件接收器的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>
Run Code Online (Sandbox Code Playgroud)

Jig*_*put 7

问题是在Document library事件处理程序中Item Updating也检查它Document是在检入模式还是检出.这就是它被召唤两次的原因.

你应该把你的代码放进去

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

有关详细信息,这里有一篇描述Document's事件整体情况的好文章.