Il blog di Giuseppe Marchi - SharePoint MVP
NAVIGATION - SEARCH

Un pò di extension method per la lettura di valori da campi SharePoint tramite il server object model

Tramite il modello ad oggetti è possibile recuperare il valore dei singoli campi di un elemento di lista/libreria presente all'interno di un qualsiasi sito SharePoint. Lo possiamo fare utilizzando le "ormai note" classi SPSite, SPWeb, SPList e SPListItem.
Dico "solite" perchè sono alla base dell'utilizzo del modello ad oggetti server-side di SharePoint e fanno parte del prodotto fin dalle prime versioni, quindi immagino che chiunque lavori con SharePoint (lato sviluppo ovviamente) le conosca o, quanto meno, ci abbia avuto a che fare.
Il valore di un campo, a partire da un elemento o da un file che sia, lo possiamo recuperare sfruttando l'indice della classe SPListItem. Tale indice vede la possibilità di passare tre diversi parametri:
  • Guid - Rappresenta l'identificativo del campo di cui vogliamo recuperare il valore
  • Int32 - Rappresenta l'indice numerico del campo, proprio come un indice di una collezione di oggetti
  • String - Rappresenta il DisplayName, l'InternalName o lo StaticName del campo di cui vogliamo recuperare il valore
Quando si utilizza questo indice all'interno delle proprie personalizzazioni SharePoint è sempre bene evitare di utilizzare il DisplayName del campo. Questo semplicemente perchè è un valore che l'utente finale può modificare tramite l'interfaccia web del prodotto e, tale modifica, causerebbe un malfunzionamento della nostra applicazione.
L'indice numero non lo prendo neanche in considerazione per ovvi motivi.
Il guid è un modo sicuro per recuperare il valore del campo, ma piuttosto complicato per lo sviluppatore da inserire all'interno dei propri sorgenti e non tanto facile da manutenere.
In soldoni, il metodo migliore è quello di utilizzare l'InternalName del campo.

Come ritorno invece, questo indice ci crea un Object. Questo significa che dobbiamo preoccuparci noi stessi di trasformare il risultato nel tipo che ci interessa tramite un "bel" cast.
Per scegliere la classe da utilizzare dobbiamo affidarci un pò all'esperienza, visto che nella documentazione questa cosa non è mai stata chiarissima. Campi di testo e campi numerici li possiamo castare utilizzando le strutture string e int, lo stesso per le date (DateTime) e per le choice (sempre string). Per altri campi più particolari invece, il modello ad oggetti di SharePoint mette a disposizione un pò di classi apposite tipo la SPFieldUserValue (utile a recuperare un valore di tipo utente o gruppo) o la SPFieldLookupValue (utile invece a recuperare un valore da un campo lookup).

Noi in Dev4Side ci siamo scritti un pò di metodi di base per recuperare valori da campi di liste SharePoint, sfruttando una tecnica che ci permette di recuperare tale valore in totale sicurezza.
Questa tecnica vede l'utilizzo del metodo GetFieldByInternalName della classe SPFieldCollection, utile a recuperare l'identificativo del campo di cui vogliamo leggere il valore tramite, appunto, il suo InternalName.

Vi lascio qui alcuni di questi metodi, per recuperare campi di tipo "Single line" o "Note", campi numerici, campi lookup, date e campi per l'inserimento di utenti.

namespace D4S.SharePoint.Core.SPExtensions
{
    public static class SPListItemExtensions
    {        
        public static string GetStringValue(this SPListItem item, string internalName)
        {
            if (item != null)
                return item[item.Fields.GetFieldByInternalName(internalName).Id] != null ? item[item.Fields.GetFieldByInternalName(internalName).Id].ToString() : string.Empty;
            else
                return null;
        }

        public static int GetIntValue(this SPListItem item, string internalName)
        {
            if (item != null)
            {
                int tempVal = 0;
                return item[item.Fields.GetFieldByInternalName(internalName).Id] != null && int.TryParse(item[item.Fields.GetFieldByInternalName(internalName).Id].ToString(), out tempVal)
                ? tempVal : 0;
            }
            else
                return 0;
        }

        public static string GetLookupValue(this SPListItem item, string internalName)
        {
            string value = string.Empty;
            var field = item.Fields.GetFieldByInternalName(internalName) as SPFieldLookup;
            if (field != null && item[field.Id] != null)
            {
                var objField = item[field.Id];
                if (objField != null)
                {
                    var fieldValue = field.GetFieldValue(objField.ToString()) as SPFieldLookupValue;
                    if (fieldValue != null)
                    {
                        value = fieldValue.LookupValue;
                    }
                }
            }
            return value;
        }

        public static int GetLookupIdValue(this SPListItem item, string internalName)
        {
            int value = 0;
            var field = item.Fields.GetFieldByInternalName(internalName) as SPFieldLookup;
            if (field != null && item[field.Id] != null)
            {
                var objField = item[field.Id];
                if (objField != null)
                {
                    var fieldValue = field.GetFieldValue(objField.ToString()) as SPFieldLookupValue;
                    if (fieldValue != null)
                    {
                        value = fieldValue.LookupId;
                    }
                }
            }
            return value;
        }

        public static DateTime GetDateTimeValue(this SPListItem item, string internalName)
        {
            DateTime date = DateTime.MinValue;
            DateTime result = DateTime.MinValue;
            if (item != null)
            {
                if (item[item.Fields.GetFieldByInternalName(internalName).Id] != null && DateTime.TryParse(item[item.Fields.GetFieldByInternalName(internalName).Id].ToString(), out date))
                    result = date;
            }
            return result;
        }

        public static bool GetBoolValue(this SPListItem item, string internalName)
        {
            if (item != null)
                return item[item.Fields.GetFieldByInternalName(internalName).Id] != null ? Convert.ToBoolean(item[item.Fields.GetFieldByInternalName(internalName).Id].ToString()) : false;
            else
                return false;
        }

        public static SPUser GetUserValue(this SPListItem item, string internalName)
        {
            var field = item.Fields.GetFieldByInternalName(internalName) as SPFieldUser;

            if (field != null && item[field.Id] != null)
            {
                var fieldValue = field.GetFieldValue(item[field.Id].ToString()) as SPFieldUserValue;
                if (fieldValue != null)
                {
                    return fieldValue.User;
                }
            }
            return null;
        }
    }
}

Trovate gli altri all'interno del progetto D4S.SharePoint.Core.
Come sempre, se volete contribuire, siete ben accetti :)
blog comments powered by Disqus