Comment obtenir seulement les champs personnalisés à partir d'une liste?
-
10-12-2019 - |
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.
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);
}
}
}
}