Pergunta

A razão pela qual item de atualização do receptor de evento é acionado duas vezes em caso de bibliotecas de documentos é porque de check-in/check-out.

Também pode disparar duas vezes em caso de doc biblioteca/lista se estamos atualizando o item atual com valores neste item a atualização do evento.

Como podemos lidar com ambas as situações, através de código?

Foi útil?

Solução

Para o cenário quando você acionar o segundo ItemUpdating alterando valores de item você pode usar o EventFiringEnabled parâmetro (você deve usar um try - catch -finally em torno dele):

this.EventFiringEnabled = false;
// Do the changes
item.Update();
this.EventFiringEnabled = true;

O outro cenário é mais difícil, e a razão por trás de eu usar ItemUpdated em vez disso, sempre que possível!

Você pode verificar o BeforeProperties, ListItem e AfterPropertiesem seu ItemUpdating receptor de eventos para verificar se há atualizações que estão sendo feitas que você tem que agir.Se não, em seguida, basta return.

Aqui está um guia para quando você pode usar .BeforePropertiese quando você deve ir no .ListItem em vez disso

Outras dicas

public override void ItemUpdating(SPItemEventProperties properties)
{
  try
  {
    //is the item checked out?
    if (isCheckin(properties) == false)
    {
         this.EventFiringEnabled = false;

         //do your stuff

    }
  }
  catch(Exception a)
  {
    //catch any errors
  }
  finally
  {
    this.EventFiringEnabled = true; 
  }
} 

private bool isCheckin(SPItemEventProperties properties)
{
    if (properties.AfterProperties["vti_sourcecontrolcheckedoutby"] == null 
         && properties.BeforeProperties["vti_sourcecontrolcheckedoutby"] != null)
    {
        return true;
    }
    return false;
}

https://www.simple-talk.com/dotnet/.net-tools/managing-itemupdating-and-itemupdated-events-firing-twice-in-a-sharepoint-item-event-receiver/

@Robert sobre o antes de propriedades, sim, o seu direito que seria o mesmo, independentemente....única solução possível, que eu posso pensar seria usar esta vez

private bool isCheckin(SPItemEventProperties properties)
{
    string BeforeVal = properties.ListItem["vti_sourcecontrolcheckedoutby"];

    if (properties.AfterProperties["vti_sourcecontrolcheckedoutby"] == null 
         && BeforeVal != null)
    {
        return true;
    }
    return false;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a sharepoint.stackexchange
scroll top