Архивация списков #13
@@ -123,12 +123,23 @@ public sealed class SharePointClient(
|
|||||||
public async Task<IReadOnlyList<SharePointFieldSchema>> GetCustomFieldsAsync(
|
public async Task<IReadOnlyList<SharePointFieldSchema>> GetCustomFieldsAsync(
|
||||||
string siteUrl, string listServerRelativeUrl, CancellationToken cancellationToken)
|
string siteUrl, string listServerRelativeUrl, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
// FromBaseType отсеивает колонки базового типа (Title, Author, Created …) —
|
// Ни FromBaseType, ни CanBeDeleted не годятся как признак «колонку явно
|
||||||
// они есть в любом новом списке. Hidden/ReadOnlyField — служебные, их создать
|
// добавили в список»: у переиспользуемых стандартных site-колонок SharePoint
|
||||||
// всё равно нельзя. Фильтр в OData, а не в C#, чтобы не тащить лишнее по сети.
|
// (например, «Department» — встроенная текстовая колонка из схемы v3,
|
||||||
|
// подключаемая через DelayActivateTemplateBinding) ОБА флага стоят как у
|
||||||
|
// настоящего системного поля, хотя колонка реально добавлена в список и в
|
||||||
|
// неё пишут данные. Из-за этого такие колонки тихо выпадали из копирования —
|
||||||
|
// без ошибки, просто без предупреждения.
|
||||||
|
//
|
||||||
|
// Поэтому здесь фильтруем только Hidden/ReadOnlyField (их создать всё равно
|
||||||
|
// нельзя), а отделять настоящие базовые поля (Title, ID, ContentType …) от
|
||||||
|
// явно добавленных — задача вызывающего кода: он сравнивает с полями
|
||||||
|
// ТОЛЬКО ЧТО СОЗДАННОГО пустого списка того же шаблона (см. CloneAsync,
|
||||||
|
// alreadyThere) — то, что есть на обоих, действительно базовое; то, что
|
||||||
|
// есть только на источнике, добавлено явно, независимо от флагов SharePoint.
|
||||||
var url = $"{siteUrl.TrimEnd('/')}/_api/web/getList('{Escape(listServerRelativeUrl)}')/fields" +
|
var url = $"{siteUrl.TrimEnd('/')}/_api/web/getList('{Escape(listServerRelativeUrl)}')/fields" +
|
||||||
"?$select=InternalName,SchemaXml,FromBaseType,Hidden,ReadOnlyField" +
|
"?$select=InternalName,SchemaXml,Hidden,ReadOnlyField" +
|
||||||
"&$filter=Hidden eq false and ReadOnlyField eq false and FromBaseType eq false";
|
"&$filter=Hidden eq false and ReadOnlyField eq false";
|
||||||
|
|
||||||
var json = await GetAsync(siteUrl, url, cancellationToken);
|
var json = await GetAsync(siteUrl, url, cancellationToken);
|
||||||
var rows = json.TryGetProperty("value", out var value) && value.ValueKind == JsonValueKind.Array
|
var rows = json.TryGetProperty("value", out var value) && value.ValueKind == JsonValueKind.Array
|
||||||
|
|||||||
Reference in New Issue
Block a user