Gestion du récepteur d'événements ItemUpdating se déclenchant plusieurs fois
-
29-09-2020 - |
Question
La raison pour laquelle le récepteur d'événements de mise à jour d'élément se déclenche deux fois dans le cas de bibliothèques de documents est due à l'enregistrement/extraction.
Il peut également se déclencher deux fois en cas de bibliothèque/liste de documents si nous mettons à jour les valeurs d'élément actuelles avec cet événement de mise à jour d'élément.
Comment pouvons-nous gérer ces deux cas via le code ?
La solution
Pour le scénario où c'est vous qui déclenchez la seconde ItemUpdating
en modifiant les valeurs des éléments, vous pouvez utiliser le EventFiringEnabled
paramètre (vous devez utiliser un try - catch -finally
autour de):
this.EventFiringEnabled = false;
// Do the changes
item.Update();
this.EventFiringEnabled = true;
L'autre scénario est plus difficile, et la raison pour laquelle j'utilise ItemUpdated
au lieu de cela, lorsque cela est possible !
Vous pourriez vérifier le BeforeProperties
, ListItem
et AfterProperties
dans ton ItemUpdating
récepteur d'événements pour vérifier si des mises à jour sont en cours sur lesquelles vous devez agir.Sinon, alors juste return
.
Voici un guide pour quand tu peux utiliser .BeforeProperties
et quand tu devrais y aller .ListItem
plutôt
Autres conseils
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 sur les propriétés avant, oui, ils seraient les mêmes quelconques, peu importe ... Seule une solution possible que je puisse penser que cela aurait à la place
private bool isCheckin(SPItemEventProperties properties)
{
string BeforeVal = properties.ListItem["vti_sourcecontrolcheckedoutby"];
if (properties.AfterProperties["vti_sourcecontrolcheckedoutby"] == null
&& BeforeVal != null)
{
return true;
}
return false;
}