Как получить только пользовательские поля из списка?

sharepoint.stackexchange https://sharepoint.stackexchange.com//questions/97859

  •  10-12-2019
  •  | 
  •  

Вопрос

Я работаю с объектной моделью на стороне клиента.В консольном приложении я извлекаю все поля из пользовательского списка.Проблема в том, что Clientcontext извлекает мне кучу внутренних полей, которые я не хочу включать.Также это приводит к тому, что некоторые поля отображаются более одного раза.

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

Есть ли способ напечатать только пользовательские поля?Это означало бы пропуск таких полей, как internalID, GUID...

Я попробовал следующее:

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

К сожалению, это не только не решает проблему, но и является не очень хорошим решением для случая, когда я действительно хочу отображать пользовательские, но скрытые поля.

Это было полезно?

Решение 2

Следующий подход, по-видимому, решает проблему.Вместо этого для проверки, не является ли поле Hidden Я проверил, так ли это FromBaseType.

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

Другие советы

В SSOM SPField.Идентификатор источника свойство позволяет определять

либо пространство имен, определяющее встроенное поле, либо, если оно обычай поле, идентификатор GUID, который идентифицирует список или веб-сайт, на котором он был создан.

В CSOM SourceId имущество не выставлено на Поле объект, но он может быть извлечен из SchemaXml как показано ниже:

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

Приведенный ниже пример демонстрирует, как извлекать и печатать пользовательские поля для списка:

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

            }

        }
    }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с sharepoint.stackexchange
scroll top