Communardo Software GmbH, Kleiststraße 10 a, D-01129 Dresden
+49 (0) 351/850 33-0

SPFieldCollection.AddField & AddFieldAsXml

Möchte man einer SharePoint-Liste programmatisch ein Feld (eine Spalte) hinzufügen, dann hat man verschiedene Möglichkeiten, dies umzusetzen. SPFieldCollection stellt drei Methoden mit verschiedenen Überladungen zur Verfügung.

  • Add
  • AddFieldAsXML
  • AddLookup

In diesem Artikel möchte ich speziell auf die Unterschiede der beiden ersten Methoden eingehen. Wann sollte man welche Methode verwenden?

Folgendes Szenario:

Site-Column Öffentliche Ämter (Managed Metadata Field) soll einer Liste eines Webs der SiteCollection hinzugefügt werden:

<Field 
    Type="TaxonomyFieldType" 
    DisplayName="Öffentliche Ämter" 
    Required="TRUE" 
    EnforceUniqueValues="FALSE" 
    Group="Custom" 
    ID="{BBB05D05-BBBD-BB5B-BB02-BBB738BB202B}" 
    SourceID="{81de0011-836c-43a5-b05a-d7fe9afa2907}" 
    StaticName="publicoffice" 
    InternalName="publicoffice" 
    Overwrite="TRUE" 
    xmlns="http://schemas.microsoft.com/sharepoint/">
    <Default />
</Field>

Die Definitionen für die TermSet-Zuweisung passiert im Code. Der StaticName und der InternalName lauten publicoffice.

Möglichkeit 1:

var myList = currentWeb.Lists["MyList"];
var fieldToAdd = currentWeb.Site.RootWeb.Fields[new Guid("BBB05D05-BBBD-BB5B-BB02-BBB738BB202B")]
myList.Fields.Add(fieldToAdd);

Möglichkeit 2:

var myList = currentWeb.Lists["MyList"];
var fieldToAdd = currentWeb.Site.RootWeb.Fields[new Guid("BBB05D05-BBBD-BB5B-BB02-BBB738BB202B")];
var addToDefaultView = true;
myList.Fields.AddFieldAsXml(fieldToAdd.SchemaXml, addToDefaultView, SPAddFieldOptions.AddToAllContentTypes);

Auf den ersten Blick ist der wesentliche Unterschied der, dass Möglichkeit 2 ein direktes Hinzufügen in die Default-View veranlasst und das Feld zusätzlich zu allen ContentTypes hinzufügt. (Hier können auch andere Felderoptionen übergeben werden). Ansonsten sollte das Feld eigentlich genau gleich hinzugefügt werden, da das XML dasselbe ist, bzw. beim Hinzufügen über das SchemaXML das XML des ursprünglichen Feldes verwendet wird.

Was uns der Methodenname und auch die übergebenen Parameter aber nicht sagen ist, dass StaticName und InternalName unterschiedlich gesetzt werden. Was bedeutet das?

Bei der Add-Methode werden Static- und InternalName entsprechend der Site-Column gesetzt. Das heißt so wie das ursprünglich-definierte XML veröffentlicht wurde, so werden auch alle Eigenschaften für eine Spalte an einer Liste übernommen. Die SiteColumn wird als Vorlage genommen. Die neue Spalte an der Liste ist mit der Site-Column „verknüpft“.

Bei der AddFieldAsXml werden Static- und InternalName nicht, wie ursprünglich im XML definiert, gesetzt, sondern neu generiert. Und zwar aus dem Titel! Das bedeutet in diesem Fall, dass die beiden Attribute unschöne Werte bekommen:

aus

Öffentliche Ämter

wird dann

%5Fx00d6%5Fffentliche%5Fx0020%5F%5Fx00c4%5Fmter

Wann könnte das zum Problem werden? Ein Beispiel:

Wird über die Spalte gefiltert, so wird der aktuellen Url ein Query-String angehängt. Dieser besteht unter anderem auch aus dem zu filterndem Feld (InternalName). Je nachdem welche Add-Methode man verwendet, wird sich der Query-String unterscheiden:

Methode 1:

?FilterField1=publicoffice&FilterValue1=0&FilterOp1=In&FilterLookupId1=1&FilterData1=0%2C80510cd1%2Dd4f7%2D4a7f%2Db5ca%2D5050a5b14a76

Methode 2

&FilterField1=%5Fx00d6%5Fffentliche%5Fx0020%5F%5Fx00c4%5Fmter&FilterValue1=0&FilterOp1=In&FilterLookupId1=1&FilterData1=0%2C80510cd1%2Dd4f7%2D4a7f%2Db5ca%2D5050a5b14a76

Möchte man nun diese oder eine ähnliche Funktion nachbilden, so wird womöglich der InternalName, bei einem durch AddFieldAsXml hinzugefügten Feld,  nicht  mit dem vermuteten Namen übereinstimmen. Der Wert kann nicht über die SiteColumn ermittelt werden bzw. nur über den Titel und einer unschönen Encodierung.

FAZIT:

Werden die zusätzlichen FieldOptions, wie zum Beispiel SPAddFieldOptions.AddToAllContentTypes, nicht benötigt, dann sollte auf die klassische Add-Methode zurückgegriffen werden.

Sollte man dennoch einmal nicht um die AddFieldAsXML-Methode herum kommen, dann sollte der DisplayName erst nach Hinzufügen des Feldes mit einem richtigen Wert (mit Leerzeichen, Umlauten usw.) versehen werden.

1 Kommentar

In der SPFieldCollection.AddFieldAsXml Method (String, Boolean, SPAddFieldOptions) kann man bei den SPAddFieldOptions den Wert SPAddFieldOptions.AddFieldInternalNameHint verwenden. Dies führt dazu, dass der gegebene interne Name verwendet wird und nicht der InternalName aus dem DisplayName ermittelt wird.

Kommentar hinterlassen


Pin It on Pinterest