2013-08-02 2 views
2

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

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

Я вношу следующее Xml с помощью fieldCollection (XML, ложные, 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 «Значение не попадает жгутов ожидаемый диапазон.»

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

ответ

3

Ответ, в данном случае на стороне клиента 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 свисает из контекста. Это не относится к типу безопасности, вы можете использовать любое поле в любом другом поле, и нет никаких претензий.

+0

Так полезно! FYI, если вы хотите управлять StaticName поля, вы можете установить это как DisplayName, Update(), а затем установить отображаемое имя на все, что вы действительно хотите, и Update() снова. DisplayName требуется, чтобы вы не могли обойти его. – SouthShoreAK

Смежные вопросы