Domanda

Il motivo per cui l'aggiornamento degli articoli L'aggiornamento del ricevitore evento si incrementa due volte in caso di librerie di documenti a causa del check-in / checkout.

Inoltre può sparare due volte in caso di biblioteca / lista DOC se aggiorniamo i valori della voce corrente con questo elemento Aggiornamento dell'evento.

Come possiamo gestire entrambi questi casi tramite il codice?

È stato utile?

Soluzione

Per lo scenario Quando si è quella che attiva il secondo ItemUpdating cambiando valori elementi è possibile utilizzare il parametro EventFiringEnabled (è necessario utilizzare un try - catch -finally Around It):

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

L'altro scenario è più duro e la ragione dietro perché uso ItemUpdated invece quando mai è possibile!

È possibile controllare il BeforeProperties, ListItem e AfterPropertiesin il ricevitore evento ItemUpdating per verificare se ci sono aggiornamenti apportati a cui è necessario agire.In caso contrario, solo return.

Ecco una guida per quando è possibile utilizzare .BeforePropertiesAndQuando dovresti andare nel .ListItem invece

Altri suggerimenti

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-ricevitore /

@Robert A proposito dei Prima Proprietà, sì il tuo diritto Sarebbero lo stesso indipendentemente .... solo possibile soluzione che posso pensare di usare questo invece

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

    if (properties.AfterProperties["vti_sourcecontrolcheckedoutby"] == null 
         && BeforeVal != null)
    {
        return true;
    }
    return false;
}
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a sharepoint.stackexchange
scroll top