Gestire itemupDating evento ricevitore che spara più di una volta
-
29-09-2020 - |
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?
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 AfterProperties
in 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 .BeforeProperties
AndQuando 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;
}
.
@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;
}
.