Wie viele von euch wissen, eignen Sich SharePoint EventReceivers wunderbar, um sich an SharePoint-Events zu hängen und darauf zu reagieren, um eigenen Code auszuführen. Oft werden Events z. B. zur Validierung von eingegebenen Werten eingesetzt.
Nachfolend eine Liste der verfügbaren Events für SharePoint 2007:
Events für Websites (SPWeb) – SPWebEventReceiver:
Before:
|
After:
|
SiteDeleting
WebDeleting WebMoving |
SiteDeleted
WebDeleted WebMoved |
Events für Listen (SPList) – SPListEventReceiver:
Before:
|
After:
|
FieldAdding
FieldUpdating FieldDeleting |
FieldAdded
FieldUpdated FieldDeleted |
Events für Listenelemente (SPList) – SPItemEventReceiver:
Before:
|
After:
|
ItemAdding
ItemUpdating ItemDeleting ItemAttachmentAdding ItemAttachmentDeleting ItemCheckingIn ItemCheckingOut ItemFileMoving |
ItemAdded
ItemUpdated ItemDeleted ItemAttachmentAdded ItemAttachmentDeleted ItemCheckedIn ItemCheckedOut ItemFileConverted ItemFileMoved ItemUncheckedOut |
Events für E-Mail-Empfang (SPEmailEventReceiver):
Before:
|
After:
|
|
EmailReceived
|
Wieso Before und After?
Wenn Ereignisse vor der tatsächlichen Ausführung (z. B. löschen, auschecken, ändern, …) ausgelöst werden sollen, benutzt man synchrone Events. Wenn Ereignisse nach der tatsächlichen Ausführung ausgelöst werden sollen, kommen asynchrone Events zum Einsatz.
Wenn Ereignisse vor der tatsächlichen Ausführung (z. B. löschen, auschecken, ändern, …) ausgelöst werden sollen, benutzt man synchrone Events. Wenn Ereignisse nach der tatsächlichen Ausführung ausgelöst werden sollen, kommen asynchrone Events zum Einsatz.
Konkret:
Before-Events werden synchron, After-Events asynchron abgearbeitet. Z. B. wird ItemAdding vor dem tatsächlichem Hinzufügen eines Elementes ausgeführt, ItemAdded erfolgt nach dem Hinzufügen des Elementes.
Nachfolgend nun ein EventReceiver-Beispiel, indem übeprüft wird, ob während der Erstellung einer Aufgabe der Titel einen entsprechenden Wert enthält (in meinem Beispiel “Test”). Ebenfalls möchte ich verhindern, dass der Titel nachträglich geändert wird.
Um dies zu erreichen, habe ich eine neue Klasse erstellt, die sich von der Klasse SPItemEventReceiver ableitet.
Die eigentliche Überprüfung vor dem Speichern erfolgt wie zuvor beschrieben in der Methode ItemAdding:
public override void ItemAdding(SPItemEventProperties properties)
{
if (properties.AfterProperties[“Title”].Equals(“Test”))
{
properties.Cancel = true;
properties.ErrorMessage = “This value is invalid!”;
}
}
Falls der Inhalt in der Spalte “Title” dem Wert “Test” entspricht, wird die angegebene Fehlermeldung ausgegeben. Das neue Listenelement wird in diesem Fall nicht erstellt.
Die Überprüfung vor dem Speichern eines geänderten Listenelementes erfolgt in der Methode ItemUpdading:
public override void ItemUpdating(SPItemEventProperties properties)
{
if (properties.AfterProperties[“Title”] != properties.ListItem[“Title”])
{
properties.Cancel = true;
properties.ErrorMessage = “Title cannot be changed!”;
}
}
Hier wird der Originalwert mit dem geänderten Wert aus der Spalte “Title” verglichen. Falls die beiden Werte unterschiedlich sind, wird die angegebene Fehlermeldung ausgegeben.
Zugriff BeforeProperties / AfterProperties / ListItem (Vergleich Vorher/Nachher):
Um leichter erkennen zu können, wann über welche Eigenschaften welche Werte zurückgegeben werden, habe ich die folgende Übersicht erstellt:
Für Listen gilt:
Listenelement
|
BeforeProperties
|
AfterProperties
|
properties.ListItem
|
ItemAdding
|
Kein Inhalt
|
Neuer Wert
|
NULL
|
ItemAdded
|
Kein Inhalt
|
Neuer Wert
|
Neuer Wert
|
ItemUpdating
|
Kein Inhalt
|
Geänderter Wert
|
Original Wert
|
ItemUpdated
|
Kein Inhalt
|
Geänderter Wert
|
Geänderter Wert
|
ItemDeleting
|
Kein Inhalt
|
Kein Inhalt
|
Original Wert
|
ItemDeleted
|
Kein Inhalt
|
Kein Inhalt
|
NULL
|
Für Dokumentbibliotheken gilt:
Bibliothekelement
|
BeforeProperties
|
AfterProperties
|
properties.ListItem
|
ItemAdding
|
Kein Inhalt
|
Kein Inhalt
|
NULL
|
ItemAdded
|
Kein Inhalt
|
Kein Inhalt
|
Neuer Wert
|
ItemUpdating
|
Original Wert
|
Geänderter Wert
|
Original Wert
|
ItemUpdated
|
Original Wert
|
Geänderter Wert
|
Geänderter Wert
|
ItemDeleting
|
Kein Inhalt
|
Kein Inhalt
|
Original Wert
|
ItemDeleted
|
Kein Inhalt
|
Kein Inhalt
|
NULL
|