通过CSOM错误创建SharePoint查找字段

本文关键字:查找 字段 SharePoint 创建 CSOM 错误 通过 | 更新日期: 2023-09-27 18:25:56

我正试图使用CSOM在列表上创建一个查找字段。我在名为"用户状态类型"的ListTemplateType.GenericList中定义了查找值。此设置看起来很好,我可以在SharePoint中根据此列表成功创建字段。

当我尝试在目标列表(引用上述通用列表中查找值的列)上创建字段时,问题就出现了。

我通过fieldCollection提交以下Xml(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。我还对使用命名引用的陷阱感兴趣。

通过CSOM错误创建SharePoint查找字段

在使用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运算符。这不是一个类型安全的强制转换,您可以将任何字段强制转换为任何其他类型的字段,并且没有任何抱怨。