создание поля поиска SharePoint с помощью ошибки CSOM

Я пытаюсь создать поле поиска в списке с помощью CSOM. У меня есть значения Lookup, определенные в ListTemplateType.GenericList с именем «Типы статуса пользователя». Эта настройка выглядит нормально, и я могу успешно создать поле для этого списка в самом SharePoint.

Проблема возникает, когда я пытаюсь создать поле в целевом списке (столбец, который ссылается на значения поиска в общем списке, упомянутом выше).

Я отправляю следующий Xml через fieldCollection(xml, false, AddFieldOptions.AddToAllContentTypes)

<Field Type="Lookup" DisplayName="UserStatus" Description="System Activation Status" Required="TRUE" EnforceUniqueValues="FALSE" List="Lists/User Status Types" WebId="~sitecollection" Overwrite="TRUE" PrependId="TRUE" ShowField="Title" UnlimitedLengthInDocumentLibrary="FALSE" StaticName="Status" Name="Status" Hidden="FALSE" ReadOnly="FALSE" />

Этот список генерирует исключение ServerException «Значение не попадает в ожидаемый диапазон».

Обратите внимание, что хотя обращение к списку через понятное имя является идеальным, у меня также есть быстрый доступ к Guid в любое время. Меня также интересуют подводные камни использования именованной ссылки.


person S. Hebert    schedule 02.08.2013    source источник


Ответы (1)


В данном случае с использованием клиентской стороны CSOM/c# ответ заключается в сочетании упрощения XML и опоры на взаимодействие CSOM после добавления.

Короче говоря, приведенный выше XML можно упростить до:

var lookupFieldXml = "<Field DisplayName="UserStatus" Type="Lookup" />";
var field = destinationList.Fields.AddFieldAsXml(lookupFieldXml, false, AddFieldOptions.AddToAllContentTypes);
lookupField = context.CastTo<FieldLookup>(field);
lookupField.LookupList = sourceLookupList.Id.ToString();
lookupField.LookupField = "Title";
// at this point, we can update against lookupField or field. It doesn't appear to matter.
field.Update();
context.ExecuteQuery();

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

person S. Hebert    schedule 02.08.2013
comment
Так полезно! К вашему сведению, если вы хотите контролировать StaticName поля, вы можете установить его как DisplayName, Update(), а затем установить отображаемое имя на то, что вы действительно хотите, и снова Update(). DisplayName требуется, поэтому вы не можете его обойти. - person SouthShoreAK; 14.09.2016