¿Cómo adjuntar Event Receiver a SPList mediante programación?

Estoy trabajando en un proyecto i SharePoint 2010 donde tengo varios sitios. cada uno de los sitios contiene una lista con noticias y quiero adjuntar un receptor de eventos a esas listas.

Los sitios y las listas inferiores se crean mediante programación, pero no puedo adjuntar el receptor de eventos que tengo en mi solución VS2010.

Lo he intentado con esto:

SPList list = new SPSite(siteURL).OpenWeb().Lists[listName]; 
SPEventReceiverDefinitionCollection eventReceivers = list.EventReceivers;

SPEventReceiverDefinition eventReceiver = eventReceivers.Add();
eventReceiver.Name = receiverName;
eventReceiver.Synchronization = SPEventReceiverSynchronization.Synchronous; 
eventReceiver.Type = SPEventReceiverType.ItemAdded;
eventReceiver.SequenceNumber = sequenceNumber; 
eventReceiver.Assembly = assemblyFullName;
eventReceiver.Class = assemblyClassName;
eventReceiver.Data = receiverData;

eventReceiver.Update();

Pero no funciona.

El mensaje de error es "No se pudo cargar el archivo o ensamblado 'Projekt_Test1\, \, Version\=1.0.1777.23493\, Culture\=neutral\, PublicKeyToken\=49c7547d535382ab' o una de sus dependencias. El nombre de ensamblado o la base de código proporcionados no son válidos (Excepción de HRESULT: 0x80131047)"

Gracias por ayudar.

preguntado el 22 de mayo de 12 a las 10:05

3 Respuestas

Termino creando un método de extensión de lista para esto:

public static void EnsureEventReceiver(this SPList list,IEnumerable<SPEventReceiverType> receiverTypes, Type eventHander, SPEventReceiverSynchronization synchronization, int sequenceNumber)
{
   foreach (SPEventReceiverType spEventReceiverType in receiverTypes)
   {
      string name = list.Title + spEventReceiverType.ToString();

      if (list.EventReceivers.Cast<SPEventReceiverDefinition>().All(i => i.Name != name))
      {
          SPEventReceiverDefinition eventReceiver = list.EventReceivers.Add();
          eventReceiver.Name = name;
          eventReceiver.Type = spEventReceiverType;
          eventReceiver.Assembly = eventHander.Assembly.FullName;
          eventReceiver.Class = eventHander.FullName;
          eventReceiver.SequenceNumber = sequenceNumber;
          eventReceiver.Synchronization = synchronization;
          eventReceiver.Update();
      }
   }    
}

Advertencias, limitaciones de este método:

  • Solo un evento por lista, ya que esto es lo suficientemente bueno para mí, si necesita más, debe pasar el nombre como parámetro
  • Los métodos del controlador de eventos están en la misma clase

Puedes usarlo así:

list.EnsureEventReceiver(
     new[] { SPEventReceiverType.ItemAdded, SPEventReceiverType.ItemUpdated },
     typeof(NewsItemsHandler),
     SPEventReceiverSynchronization.Synchronous, 
     10000);

contestado el 26 de mayo de 16 a las 15:05

Nunca he tenido éxito con esta versión de eventReceivers.Add() Tu estas usando.

Aquí hay un framgent de powershell que estoy usando, sería muy similar en C#

$ev = $currentList.EventReceivers.Add([Microsoft.SharePoint.SPEventReceiverType]::ItemAdded, $assemblyName, $className);

contestado el 22 de mayo de 12 a las 15:05

Un par de cosas para mirar:

  1. Su versión de ensamblado aparece como 1.0.1777.23493. Parece que se está incrementando automáticamente. Deberá establecer una versión de ensamblaje fija o se actualizará con cada compilación, rompiendo su código.
  2. Está configurando eventReceiver.Synchronization = SPEventReceiverSynchronization.Synchronous, pero ItemAdded es un evento asíncrono.
  3. Asegúrese de que su ensamblado de receptor de eventos se haya implementado en el GAC en el servidor de SharePoint y que haya reciclado los grupos de aplicaciones de SharePoint en IIS antes de ejecutar su código.

contestado el 22 de mayo de 12 a las 15:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.