Pregunta

Tengo un receptor de artículos que implementa ItemUpdated() para procesar un elemento después de haberlo cargado en una biblioteca de documentos.Todo funciona bien si agrego documentos a la biblioteca predeterminada de "Documentos compartidos"; cuando se agrega un nuevo documento, ItemUpdated() se activa normalmente.Sin embargo, si creo un nueva biblioteca de documentos en la misma colección de sitios, ItemUpdated() no se activa cuando subo un nuevo documento.Pero cuando subo otra versión, o cambio el nombre del documento, etc., ItemUpdated() se activa normalmente, simplemente no se activa al cargar el elemento.Ejemplo típico:

  • Subo 'doc1' a la biblioteca de documentos - ItemUpdated() no se ejecuta (pero sí ejecuta si la biblioteca de documentos es "documentos compartidos");
  • Subo otra versión de 'doc1' - ItemUpdated() se ejecuta como se esperaba;
  • Cambio el nombre de 'doc1' - ItemUpdated() se ejecuta como se esperaba.

Me hicieron creer que el orden de los eventos al agregar un documento es normalmente:

agregando - agregado - actualizando - actualizado

Entonces ¿por qué mi ItemUpdated() ¿No se activa para bibliotecas que no sean "Documentos compartidos"?¿Existe alguna configuración que pueda estar causando esto?

Tenga en cuenta que, por diversos motivos, no puedo realizar el procesamiento interno. ItemAdded().

Elementos.xml:

<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
  <Receivers ListTemplateId="101">
    <Receiver>
      <Name>MyEventReceiverItemUpdated</Name>
      <Type>ItemUpdated</Type>
      <Assembly>$SharePoint.Project.AssemblyFullName$</Assembly>
      <Class>MyProject.MyEventReceiver.MyEventReceiver</Class>
      <SequenceNumber>1000</SequenceNumber>
    </Receiver>
  </Receivers>
</Elements>

Código:

public class MyEventReceiver : SPItemEventReceiver
{
    // On document upload, this method is only entered if I upload to "Shared Documents"
    public override void ItemUpdated(SPItemEventProperties properties)
    {               
        base.ItemUpdated(properties); // doesn't get called either
        MyMethod(properties);
    }
}
¿Fue útil?

Solución 2

Parece que he encontrado una solución.yo implementé ItemAdded() además del original ItemUpdated() en el receptor de eventos.En el interior, fuerzo una llamada posterior a ItemUpdated() como esto:

public override void ItemAdded(SPItemEventProperties properties)
{            
    base.ItemAdded(properties);
    properties.ListItem.UpdateOverwriteVersion();            
}

Tenga en cuenta que UpdateOverwriteVersion "actualiza el elemento sin crear otra versión del elemento" (MSDN).Esto resulta en una llamada a ItemUpdated() cuando se agrega un nuevo elemento;Además, no crea una nueva versión del elemento (es decir,no terminas con 2 versiones cuando agregas un nuevo elemento por primera vez).Hasta ahora, esto funciona como se esperaba para todas las bibliotecas de documentos, con y sin control de versiones.

Otros consejos

¿Tiene columnas adicionales en una biblioteca u otra?Parece que eso hace una diferencia en términos de si ItemUpdating() se activa al cargar.Mira esto esta publicación.La frase clave es,

"Los eventos que se activan durante cuando se agrega un documento a una biblioteca de documentos puede incluir itemupdating y itemupdated.Pero solo si hay campos adicionales incluidos en el proceso ".

Por lo tanto, es posible que desee probar diferentes configuraciones de biblioteca en su entorno para comprender mejor cómo esta "característica" de SharePoint afecta su sistema.

Además, puedo apreciar que puede haber razones para evitar ItemAdded.Si ItemUpdated sigue siendo un problema para usted y está dispuesto a compartir algunos detalles sobre por qué ItemAdded no es deseable en su entorno, considere hacer una pregunta por separado aquí sobre cómo hacer que ItemAdded funcione en su sistema.

¡Buena suerte!

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