Question

Je suis en train de travailler avec le Côté Client de l'Objet Modèle.Dans une application console, je suis à la récupération de tous les champs à partir d'une liste personnalisée.Le problème est le Clientcontext extrait de moi un tas de champs internes, je ne veux pas être inclus.Aussi cela provoque certains champs apparaissent plus d'une fois.

string siteURL = "http:XYZ";
ClientContext context = new ClientContext(siteURL);
Web oWebSite = context.Web;
context.Load(oWebSite);
context.ExecuteQuery();

//Get the list by title
List produktKatalogListe = spLists.GetByTitle("Produktkatalog");
CamlQuery camlQuery = new CamlQuery();
camlQuery.ViewXml = "<View/>";
ListItemCollection listItems = produktKatalogListe.GetItems(camlQuery);
context.Load(produktKatalogListe);
context.Load(listItems);
context.Load(produktKatalogListe.Fields);
context.ExecuteQuery();

foreach(Field field in produktKatalogListe.Fields)
{
Console.WriteLine("{0} - {1} - {2} - {3} - {4}",field.Title,field.InternalName,field.Hidden,field.CanBeDeleted,field.FieldTypeKind);
}

Est-il un moyen d'imprimer uniquement les champs personnalisés?Cela signifierait en omettant les champs comme internalID, GUID...

J'ai essayé le suivant:

if(!field.Hidden)
{
Console.WriteLine("{0} - {1} - {2} - {3} - {4}",field.Title,field.InternalName,field.Hidden,field.CanBeDeleted,field.FieldTypeKind);
}

Malheureusement, ce n'est pas seulement ne résout pas le problème, mais n'est pas aussi une très bonne solution pour les cas je ne veux affichage personnalisé, mais les champs cachés.

Était-ce utile?

La solution 2

L'approche suivante semble résoudre le problème.Au lieu de vérifier si le champ n'est pas Hidden J'ai vérifié si il n'est pas FromBaseType.

if(!field.FromBaseType)
{
Console.WriteLine("{0} - {1} - {2} - {3} - {4}",field.Title,field.InternalName,field.Hidden,field.CanBeDeleted,field.FieldTypeKind);
}

Autres conseils

Dans SSOM SPField.SourceId propriété permet de déterminer

soit l'espace de noms qui définit un champ prédéfini ou, si c'est une personnalisé champ, le GUID qui identifie la liste ou un site Web où il a été créée.

Dans l'otite chronique SourceId la propriété n'est pas exposée pour Champ objet, mais il pourrait être extraite de la SchemaXml comme démontré ci-dessous:

    private static Dictionary<string, string> ParseSchemaXml(string schemaXml)
    {
        var properties = new Dictionary<string, string>();
        var xdoc = XDocument.Parse(schemaXml);
        var attributes = xdoc.Descendants("Field").Attributes();
        foreach (var attr in attributes)
        {
          if(!properties.ContainsKey(attr.Name.LocalName))
              properties.Add(attr.Name.LocalName,attr.Value);
        }
        return properties;
    }


    //Usage
    var properties = ParseSchemaXml(field.SchemaXml);
    var sourceId = properties["SourceID"]; 

L'exemple ci-dessous montre comment récupérer et d'imprimer des champs personnalisés pour une Liste:

    public static void PrintCustomFields(string url, string listTitle)
    {
        const string fieldBuiltInNS = "http://schemas.microsoft.com/sharepoint/v3";
        using (var context = new ClientContext(url))
        {
            //context.Credentials = credentials;
            var web = context.Web;
            var list = web.Lists.GetByTitle(listTitle);
            web.Context.Load(list, l => l.Fields);
            web.Context.ExecuteQuery();


            foreach (var field in list.Fields)
            {
                var properties = ParseSchemaXml(field.SchemaXml);
                if (properties["SourceID"] != fieldBuiltInNS)
                {
                    Console.WriteLine("Field: {0}",field.InternalName);
                }

            }

        }
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à sharepoint.stackexchange
scroll top