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?














