Как получить только пользовательские поля из списка?
-
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);
}
}
}
}