¿Cómo adjuntar Event Receiver a SPList mediante programación?
Frecuentes
Visto 16,065 veces
4
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.
3 Respuestas
8
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
2
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
2
Un par de cosas para mirar:
- 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.
- Está configurando eventReceiver.Synchronization = SPEventReceiverSynchronization.Synchronous, pero ItemAdded es un evento asíncrono.
- 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 c# sharepoint events splist or haz tu propia pregunta.