Pregunta

Estoy trabajando con el modelo de objetos del lado del cliente.En una aplicación de consola, estoy recuperando todos los campos de una lista personalizada.El problema es que Clientcontext me busca un montón de campos internos que no quiero que se incluyan.Además, esto hace que algunos de los campos aparezcan más de una vez.

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

¿Existe alguna forma de imprimir solo campos personalizados?Esto significaría omitir campos como internalID, GUID...

Intenté lo siguiente:

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

Desafortunadamente, esto no sólo no resuelve el problema sino que tampoco es una muy buena solución para el caso en el que quiero mostrar campos personalizados pero ocultos.

¿Fue útil?

Solución 2

El siguiente enfoque parece resolver el problema.En su lugar, para verificar si el campo no es Hidden, verifiqué si no es FromBaseType.

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

Otros consejos

En SSOM SPField.FuenteId propiedad permite determinar

ya sea el espacio de nombres que define un campo incorporado o, si es un costumbre campo, el GUID que identifica la lista o el sitio web en el que se encontraba Creado.

En CSOM SourceId la propiedad no está expuesta para Campo objeto, pero podría ser extraído de esquemaXml como se demuestra a continuación:

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

El siguiente ejemplo demuestra cómo recuperar e imprimir campos personalizados para una Lista:

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

            }

        }
    }
Licenciado bajo: CC-BY-SA con atribución
scroll top