• home
    • news & events
    • blog
  • über uns
    • projekte und referenzen
    • partner
    • produkte & technologien
    • offene jobs / stellen
    • veröffentlichungen
  • dienstleistungen & services
    • software design & architektur
    • software entwicklung
    • beratung / consulting
    • training, kurse und workshops
  • angebote
    • quick-starts
    • trainings und kurse
    • modulare sharepoint 2010 workshops
  • kontakt
Wir bieten SharePoint und .NET
Kompetenz, Erfahrung und Know-How:
"1stQuad guaranteed."
Diesen Blog abonnieren
Subscribe in NewsGator Online Add to My AOL
Add to Google Reader or Homepage Add to netvibes

Aktuelle Posts

Quick-Tipp: Publishing Site Settings
Update: Dynamisches Wiki Inhaltsverzeichnis
Chart Part für SharePoint 2010
SharePoint Content DB Migration -> Access denied
Konfigurieren von „Gefällt mir“ und Kategorien und Notizen

Archiv

Januar 2012 (4)
Dezember 2011 (2)
November 2011 (10)
September 2011 (3)
August 2011 (7)
Juli 2011 (1)
Juni 2011 (3)
Mai 2011 (6)
April 2011 (5)
März 2011 (8)
Februar 2011 (8)
Januar 2011 (4)
Dezember 2010 (5)
November 2010 (7)
September 2010 (6)
August 2010 (2)
Juli 2010 (11)
Juni 2010 (13)
Mai 2010 (11)
April 2010 (4)
März 2010 (6)
Februar 2010 (2)
Januar 2010 (6)
Dezember 2009 (4)
November 2009 (13)
Oktober 2009 (17)
September 2009 (2)
Juli 2009 (2)
März 2009 (2)
Januar 2009 (1)

1stQuad ist Microsoft Certified Gold Partner und bietet SharePoint und .NET Produkt- und Projekt-Kompetenz, -Erfahrung und -Know-How für Entwicklung, Architektur, Beratung, Schulung, Training und Kurse in Schweiz sowie Deutschland und Östereich.
1stQuad ist MatchPoint Partner und bietet MatchPoint Produkt- und Projekt-Kompetenz, -Erfahrung und -Know-How für Entwicklung, Architektur, Beratung, Schulung, Training und Kurse in Schweiz sowie Deutschland und Östereich.
1stQuad ist Nintex Partner und bietet Nintext SharePoint Workflows Produkt- und Projekt-Kompetenz, -Erfahrung und -Know-How für Entwicklung, Architektur, Beratung, Schulung, Training und Kurse in Schweiz sowie Deutschland und Östereich.
1stQuad ist Balesio Gold Partner und bietet SharePoint FILEMinimizer Produkt- und Projekt-Kompetenz, -Erfahrung und -Know-How für Entwicklung, Architektur, Beratung, Schulung, Training und Kurse in Schweiz sowie Deutschland und Östereich.
1stQuad Solutions ist Kentico Certified Solution Partner und bietet Produkt- und Projekt-Kompetenz, -Erfahrung und -Know-How für Entwicklung, Architektur, Beratung, Schulung, Training und Kurse in Schweiz sowie Deutschland und Östereich.
© 2011 1stQuad Solutions
Alle Rechte vorbehalten
> Impressum
Wir bieten Microsoft SharePoint und .NET Projekt- und Produkt-Know-how, Kompetenz und Erfahrung für Entwicklung, Architektur, Beratung, Schulung, Training und Kurse in Zürich, Bern, Basel, Schweiz sowie Deutschland und Östereich.

Blog > November 2009

Alternative für SharePoint 2007 EventReceiver für Veröffentlichungsseiten

Wer hat sich nicht schon über das sonderbare (Nicht-)Verhalten der SharePoint Eventreceiver gewundert. Gerade für Veröffentlichungsseiten sind weder die synchronen noch die asynchronen Ereignisse wirklich nutzbar wenn wir die Eigenschaften respektive Felder der Seite automatisiert ergänzen oder verändern wollen. Dieser Beitrag zeigt eine Alternative auf, wie Feldwerte oder Eigneschaften von Veröffentlichungsseiten auch ohne EventReceiver beinflusst werden können.

Veröffentlicht am 27.11.2009 00:00:40 von Michael Hofer mit 0 Kommentar(en)

Das mit den EventReceivern in SharePoint ist ja schon lange so eine Sache... In der 2003er Version gab es nur asynchrone Events. Diese konnte man eigentlich nur dazu benutzen um andere Daten (z.b. in externen LOB Systemem) zu manipulieren. Mit der Version 2007 kamen dann noch synchrone Ereignisse dazu, allerdings ist dessen Verwendungszweck - gemäss Microsoft - vor allem dazu gedacht, ein Ereignis (z.B. das Anlegen eines neuen SPListItems) gegebenenfalls abzubrechen.

Vielfalch ist der Anwendungsfall doch aber der, dass nicht alle Informationen Informationen eines neuen Datensatzes (um mal vom SPListItem wegzukommen) vom Benutzer eingegeben werden (sollen). Vielmehr werden diese Informationen aufgrund der Eingaben oder anderer Parameter automatisch ergänzt. Wer viel mit SharePoint entwickelt weiss, dies mit den SharePoint Ereignissen zu realisieren ist ein RItt durch die Hölle... So hat z.B. der ItemAdding (synchrone) Event zwar eine Before- und eine AfterProperties Sammlung - nur die BeforeProperties geben nichts her und Änderungen an den AfterProperties werden für Bibliotheks-Listen nicht gespeichert. Für Veröffentlichungsseiten scheiden auch die asynchronen Ereignisse aus, den diese passieren erst dann, wenn SharePoint die eigentliche Bearbeitung schon abgeschlossen hat und die Seite für den Editor wieder neu lädt. Will dieser noch einmal Speichern erhält er eine Fehlermeldung, dass die Seite in der Zwischenzeit verändert worden ist...

Glücklicherweise gibt es gerade für solche Situationen eine Alternative. Speichert man nämlich eine (Veröffentlichnungs-)Seite, so nimmt SharePoint intern die Inhalte von SPContext.Current.ListItem. Dieses Wissen eröffnet uns ganz neue Perspektiven, es muss nun ja nur noch ein Weg gefunden werden um nach dem Auslösen der Speicherung noch Einfluss auf die Inhalte des neuen oder geänderten SPListItem zu nehmen.

Glücklicherweise haben sich die Entwickler von Microsoft auf die standard ASP.NET Methoden zur Validierung von Benutzeroberflächen-Inhalten besinnt und rufen explizit Page.Validate auf, bevor sie ein SPListItem speichern. Dies erlaubt uns, auf der Seite oder in einezelnen WebControls die Validate-Methode zu überschreiben, gegenenfalls Inhalte hinzuzufügen oder zu verändern. Wir können nun also unsere Seite um eigene Controls erweitern, oder aber wir Subclass-en gleich die ganze Seite. Am Beispiel einer Veröffentlichnugsseite mit eigenen PageLayout möchte ich dies kurz exemplarisch aufzeigen:

Wir erstellen also eine Klasse, welche von PageLayout ableitet und überschreiben die Methode Validate. In diesem Beispiel schreiben wir in eine verstecktes Feld die Werte eines Multi-Lookup-Feldes für die spätere Abfrage mit einem ContentQueryWebPart.

public class MyValidatingPublishingLayoutPage : Microsoft.SharePoint.Publishing.PublishingLayoutPage
{
    ...

    public override void Validate()
    {
        if (SPContext.Current.FormContext.FormMode == SPControlMode.Edit)
        {
                SPListItem item = SPContext.Current.ListItem;

                item[CustomFieldName.MyMultiValueLookupString] =
                    GetDelimitedMultiValueLookupString(item[CustomFieldName.MultiValueLookup].ToString());
        }
        base.Validate();
    }
}


Nun müssen wir unserem PageLayout nur noch beibrigen, dass es unsere (Sub-)Class verwenden soll. Hierfür editieren wir die .ASPX Datei wie folgt:

<%@ Page Language="C#" Inherits="FirstQuad.SharePoint.UI.Publishing.Examples.MyValidatingPublishingLayoutPage,FirstQuad.SharePoint.UI.Publishing.Examples, Version=1.0.0.0, Culture=neutral, PublicKeyToken=xxxa00116c38xxx" %>

Sobald wir die Assembly sauber installiert haben erhalten wir bei jeder Speicherung einer Veröffentlichungsseite mit dem entsprechenden PageLayout unser verstecktes Feld abgefüllt - ganz ohne EventReceiver!

Selbstverständlich hat diese Methode auch Nachteile! Diese Implementation ist davon abhängig, dass die Daten effektiv über die Benutzeroberfläche erfasst werden - EventReceivers sind von der Architektur her gesehen viel tiefer und unabhängig, ob die SPListItems über die Benutzeroberfläche, die API, WebServices oder eine andere Schnittstelle verändert werden.

Kommentar
Dieser Blog-Eintrag wurde noch nicht kommentiert.
Kommentar hinterlassen



 Security code
Zurück, Seite drucken