Przy dodawaniu mojego własnego SPItemEventReceiver do Item Content Type zauważyłem, że wszystkie dodane receivers mają ID równe Guid.Empty ({00000000-0000-0000-0000-000000000000});
Kod użyty do dodania receiver:
public static void Register<T>(this SPContentType contentType, params SPEventReceiverType[] receiverTypes) where T : SPItemEventReceiver { if (receiverTypes == null || receiverTypes.Length == 0) { return; } Type type = typeof(T); string assemblyFullName = type.Assembly.FullName; string typeFullName = type.FullName; foreach (var receiverType in receiverTypes) { var def = contentType.EventReceivers.Add(); def.Name = string.Format("{0}{1}", type.Name, receiverType); def.Assembly = assemblyFullName; def.Type = receiverType; def.Class = typeFullName; def.Update(); } }
Na obrazku poniżej to, co zawiera ContentType po dodaniu receivers:
Sposób dostanie się do definicji receiver:
Przy próbie usunięcia takiego receiver pojawia się następujący błąd:
Jeżeli jednak usuniemy po indeksie to wszystko działa poprawnie, problem jedynie jest taki, że kiedy wykonamy contentType.EventReceivers[0].Delete(); to cała kolekcja przesuwa nam się o jedną pozycję w dół, czyli jeżeli byśmy chcieli usunąć receiver z pozycji 0 i 2 to tak naprawdę usuwamy je z pozycji 0 i 1.
Innym rozwiązaniem problemu jest stworzenie listy elementów SPEventReceiverDefinition do usunięcia i następnie wykonanie na nich operacji Delete():
var toDel = new List<SPEventReceiverDefinition>(); foreach (SPEventReceiverDefinition def in contentType.EventReceivers) { // if sprawdzajacy czy o ten receiver nam chodzi toDel.Add(def); } foreach (var def in toDel) def.Delete();
Jednakże pytanie pozostaje, czy przypisywanie Guid.Empty do ID receiver jest Bugiem czy jednak poprawnym zachowaniem? Ja nie wiem :( zadałem pytanie MS i na grupie SharePoint i czekam na odpowiedź. Może jednak wy wiecie, czy to działa poprawnie czy waszym zdaniem też jest coś nie tak?