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?

¿Fue útil?

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 AfterPropertiesen 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 .BeforePropertiesy 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;
}

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

@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;
}

Licenciado bajo: CC-BY-SA con atribución
scroll top