Communardo Software GmbH, Kleiststraße 10 a, D-01129 Dresden
0800 1 255 255

Stolpersteine beim Ändern von WebPart- Properties

Anforderungen an WebParts kön­nen sich im Laufe eines Projektes ändern und erfor­dern, dass Funktionalitäten ange­passt wer­den müs­sen. Ein Beispiel hier­für kann das Erweitern, Ändern oder Löschen von WebPart- Eigenschaften sein. Stellt das Erweitern meist kein Problem dar, gilt es beim Ändern oder Löschen von WebPart – Properties jedoch einige Punkte zu beach­ten.

Folgendes Beispiel soll mög­li­che Probleme ver­an­schau­li­chen:

Ein WebPart mit einer Eigenschaft "SpecialCustomer" wird erstellt und auf einer Seite ver­wen­det. Bei einem Update der Webseite wurde die Eigenschaft "SpecialCustomer" in "Customer" umbe­nannt.

Beim erneu­ten Versuch, die Seite mit dem WebPart zu öff­nen, tritt plötz­lich die fol­gende Exception auf:

Fehler beim öffnen der Seite: "WebPart Error: [ArgumentException: The serialized data is invalid.]"

Um die­ses Problem zu behe­ben, muss der WebPart in der Lage sein,  die Daten sei­ner Vorgängerversionen ver­ar­bei­ten zu kön­nen.  Das bedeu­tet im Speziellen, dass eine ent­spre­chende Upgrade- Logik hin­ter­legt wer­den muss.

Für der­ar­tige Fälle besit­zen SharpointWebParts die Eigenschaft "UnknownXmlElements". In die­ser wer­den alle unbe­kannte WebPart Properties gespei­chert, die dem WebPart nicht mehr zuge­ord­net wer­den kön­nen (bei­spiels­weise gelöschte).

Für ASP.Net WebParts sollte das Interface IVersioningPersonalizable imple­men­tiert wer­den. Hierdurch kön­nen ver­waiste Eigenschaften bear­bei­tet wer­den. Durch Implementierung des Interfaces wird  die Methode "void Load(System.Collections.IDictionary unknownProperties)" bereit­ge­stellt, wel­che auf­ge­ru­fen wird, wenn Eigenschaften eines WebParts geän­dert wur­den. In die­ser Methode besteht dann die Möglichkeit, ein ent­spre­chen­des Mapping auf die neue Eigenschaft des WebParts zu erstel­len:

public new void Load(System.Collections.IDictionary unknownProperties)

{

string value = unknownProperties["myOldProperty"].ToString();

}

Wurden die Eigenschaften ange­passt, muss die Methode SetPersonalizationDirty() auf­ge­ru­fen wer­den. Hierdurch wird ein Flag gesetzt, das anzeigt ob der ControlState des Webparts geän­dert wurde. Der WebPartManager wird anschlie­ßend ver­an­lasst, die geän­der­ten Daten zu spei­chern. War das Mapping auf die neue Eigenschaft erfolg­reich, wird die Load Methode nicht erneut auf­ge­ru­fen.

Eine Besonderheit bei WSS- WebParts ist, dass ver­waiste Eigenschaften expli­zit aus der UnknownElements- Liste ent­fernt wer­den müs­sen, da diese per­sis­tiert ist und dadurch ggf. mehr­fach abge­ar­bei­tet wird.

Related Posts

Pin It on Pinterest