Capita spesso di imbattersi in un problema che riguarda la scrittura di valori in un field di tipo lookup multi value. In particolare se cerca di valorizzare la collezione del multi value un pò alla volta senza ogni volta salvare l'item, più o meno come riportato qui sotto, si incapperà nella exception Unable to cast object of type 'System.String' to type 'Microsoft.SharePoint.SPFieldLookupValueCollection'.
SPListItem item = getItem();
string fieldName = "LookupMultiValueField";
//Code block 1
SPFieldLookupValueCollection fieldLookupValues = (SPFieldLookupValueCollection)item[fieldName ]; // ok
fieldLookupValues.Add(new SPFieldLookupValue(1, "value1"));
item[fieldName ] = fieldLookupValues;
SPFieldLookupValueCollection fieldLookupValues = (SPFieldLookupValueCollection)item[fieldName ]; // ok
fieldLookupValues.Add(new SPFieldLookupValue(1, "value1"));
item[fieldName ] = fieldLookupValues;
//Code block 2
fieldLookupValues = SPFieldLookupValueCollection)item[fieldName]; // Exception
item.Update();
Nel primo blocco di codice viene letto un field, settato il primo valore della collection e successivamente salvata la collection sul item. Il secondo blocco genera la exception che segnalavo prima. Questo perchè una volta modificato o inserito un valore su field lookup multi value la sua tipizzazione torna ad essere string (che di fatto è come viene gestito internamente). In pratico è l'oggetto SPListItem che si occupa di mappare la stringa 1;#value1;2;#value2 di un oggetto field lookup multi value tipizzato a SPFieldLookupValueCollection sia in fase di inizializzazione che successivamente ad un update.
Per risolvere il problema occorre quindi eseguire il metodo di Update del SPListItem dopo aver inserito/aggiunto un valore alla collection. Il codice diventa:
SPListItem item = getItem();
string fieldName = "LookupMultiValueField";
fieldLookupValues = SPFieldLookupValueCollection)item[fieldName]; // Exception
item.Update();
Nel primo blocco di codice viene letto un field, settato il primo valore della collection e successivamente salvata la collection sul item. Il secondo blocco genera la exception che segnalavo prima. Questo perchè una volta modificato o inserito un valore su field lookup multi value la sua tipizzazione torna ad essere string (che di fatto è come viene gestito internamente). In pratico è l'oggetto SPListItem che si occupa di mappare la stringa 1;#value1;2;#value2 di un oggetto field lookup multi value tipizzato a SPFieldLookupValueCollection sia in fase di inizializzazione che successivamente ad un update.
Per risolvere il problema occorre quindi eseguire il metodo di Update del SPListItem dopo aver inserito/aggiunto un valore alla collection. Il codice diventa:
SPListItem item = getItem();
string fieldName = "LookupMultiValueField";
//Code block 1
SPFieldLookupValueCollection fieldLookupValues = (SPFieldLookupValueCollection)item[fieldName]; // ok
fieldLookupValues.Add(new SPFieldLookupValue(1, "value1"));
item[fieldName] = fieldLookupValues;
item.Update();
SPFieldLookupValueCollection fieldLookupValues = (SPFieldLookupValueCollection)item[fieldName]; // ok
fieldLookupValues.Add(new SPFieldLookupValue(1, "value1"));
item[fieldName] = fieldLookupValues;
item.Update();
//Code block 2
fieldLookupValues = (SPFieldLookupValueCollection)item[fieldName]; // ok
fieldLookupValues = (SPFieldLookupValueCollection)item[fieldName]; // ok
fieldLookupValues.Add(new SPFieldLookupValue(2, "value2"));
Come Best Practice consiglio di lavorare sempre con un oggetto tipizzato SPFieldLookupValueCollection evitando nel modo più esclusivo di comporsi stringhe che seguono la sintassi dei campi di lookup.
item[fieldName] = fieldLookupValues;
item.Update();
Come Best Practice consiglio di lavorare sempre con un oggetto tipizzato SPFieldLookupValueCollection evitando nel modo più esclusivo di comporsi stringhe che seguono la sintassi dei campi di lookup.
No comments:
Post a Comment