Manejo del receptor de eventos ItemUpdating que se activa más de una vez
-
29-09-2020 - |
Pregunta
La razón por la cual el receptor de eventos de actualización de elementos se activa dos veces en el caso de bibliotecas de documentos es por el check-in/check-out.
También puede activarse dos veces en el caso de una biblioteca/lista de documentos si estamos actualizando los valores del elemento actual en este evento de actualización del elemento.
¿Cómo podemos manejar ambos casos a través del código?
Solución
Para el escenario en el que eres tú quien desencadena el segundo ItemUpdating
Al cambiar los valores de los elementos, puede utilizar el EventFiringEnabled
parámetro (debe utilizar un try - catch -finally
alrededor):
this.EventFiringEnabled = false;
// Do the changes
item.Update();
this.EventFiringEnabled = true;
El otro escenario es más difícil y la razón por la que uso ItemUpdated
en su lugar, cuando sea posible!
Podrías comprobar el BeforeProperties
, ListItem
y AfterProperties
en tus ItemUpdating
receptor de eventos para comprobar si se están realizando actualizaciones sobre las que debe tomar medidas.Si no, entonces simplemente return
.
Aquí hay una guía para cuando puedas usar .BeforeProperties
y cuando deberías ir en el .ListItem
en cambio
Otros consejos
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 sobre las propiedades antes, sí, su derecho sería el mismo, independientemente ... solo una solución posible que pueda pensar que estaría usando esto en su lugar
private bool isCheckin(SPItemEventProperties properties)
{
string BeforeVal = properties.ListItem["vti_sourcecontrolcheckedoutby"];
if (properties.AfterProperties["vti_sourcecontrolcheckedoutby"] == null
&& BeforeVal != null)
{
return true;
}
return false;
}