Frage

Ich arbeite mit dem clientseitigen Objektmodell.In einer Konsolenanwendung rufe ich alle Felder aus einer benutzerdefinierten Liste ab.Das Problem ist, dass der Clientcontext mir eine Reihe interner Felder abruft, die ich nicht aufnehmen möchte.Dies führt auch dazu, dass einige der Felder mehr als einmal angezeigt werden.

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);
}

Gibt es eine Möglichkeit, nur benutzerdefinierte Felder zu drucken?Dies würde bedeuten, Felder wegzulassen wie internalID, GUID...

Ich habe Folgendes versucht:

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

Leider löst dies nicht nur das Problem nicht, sondern ist auch keine sehr gute Lösung für den Fall, dass ich benutzerdefinierte, aber versteckte Felder anzeigen möchte.

War es hilfreich?

Lösung 2

Der folgende Ansatz scheint das Problem zu lösen.Stattdessen zum Überprüfen, ob das Feld nicht ist Hidden Ich habe überprüft, ob es nicht ist FromBaseType.

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

Andere Tipps

Im SOMMER Feld.Quellcode eigenschaft ermöglicht zu bestimmen

entweder der Namespace, der ein integriertes Feld definiert, oder, falls es ein benutzerdefinierte Feld, die GUID, die die Liste oder Website identifiziert, auf der sie sich befand angelegten.

Im CSOM SourceId eigentum ist nicht ausgesetzt für Feld objekt, aber es könnte extrahiert werden aus SchemaXml wie unten gezeigt:

    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"]; 

Das folgende Beispiel zeigt, wie benutzerdefinierte Felder für eine Liste abgerufen und gedruckt werden:

    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);
                }

            }

        }
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit sharepoint.stackexchange
scroll top