ListItem Event Handler und Properties

Über das SharePoint Objektmodell ist die Auswahl der verfügbaren Events gegenüber der Vorgängerversion enorm gestiegen. So sind nun auch alle Listen (nicht nur Dokumentbibliotheken) verfügbar und es werden Events vor und nach einer Aktion abfangbar gemacht. Eine kleine Stolperfalle können die Eigenschaften des SPItemEventProperties Objekts beinhalten, gerade wenn man die ersten Gehversuche beim Implementieren eines Events unternimmt.


Diese Properties werden beim Überschreiben der entsprechenden Methode (z.B. ItemUpdating) übergeben und stehen dann mit hilfreichen Eigenschaften wie die SiteId oder das betreffende SPListItem selbst zur Verfügung. Außerdem sind darin sog. AfterProperties und BeforeProperties enthalten, welche eine nützliche Eigenschaft besitzen. Sie speichern die Inhalte eines ListItems vor- bzw. nach der Ausführung der entsprechenden Aktion in Form einer HashTable.

Beispielsweise ist für den ItemUpdating-Event (der bekanntlich vor dem Aktualisieren des ListItems eintritt) mit folgendem Aufruf der Titel des Elements nach dem eigentlichen Update abrufbar (also quasi als Vorschau für die zukünftigen Werte):

string titleAfterUpdate = properties.AfterProperties["Title"].ToString();

Der Title des ListItems vor dem Aktualisierung kann mit folgender Zeile abgerufen werden:

string titleBeforeUpdate = properties.ListItem["Title"].ToString();

Falls man nun verhindern möchte, dass der Titel nach dem Udpate geändert ist, kann dies durch folgende Abfrage unterbunden werden:

if(titleAfterUpdate != titleBeforeUpdate)
{
properties.Cancel = true;
properties.ErrorMessage = "Der Titel darf nicht geändert werden.";
}

Vielleicht kein sinnvolles Beispiel, aber es verdeutlicht die Möglichkeiten, die man damit hat 🙂

Die oben angesprochene Stolperfalle ist die Verwendung der Eigenschaften BeforeProperties, AfterProperties und ListItem des SPItemEventProperties Objekts. Denn nicht bei jedem Event stehen diese zur Verfügung. Bei obigen Beispiel würde der Aufruf des Titels über dasBeforeProperties Objekt eine Exception werfen, da die Werte vor Eintreten des Events über das ListItem Objekt abgerufen werden müssen. Andererseits wäre für einen ItemUpdated (man beachte die Endung; er tritt ein, wenn das Update bereits ausgeführt wurde) die Werte vor Update in BeforeProperties zu finden und die danach nicht in AfterProperties sondern in ListItem.

Einen Kommentar schreiben