使用CSOM创建SharePoint Lookup字段出错。

3
我正在尝试使用CSOM在列表上创建一个查找字段。我已经在名为“用户状态类型”的ListTemplateType.GenericList中定义了Lookup值。这个设置看起来很好,我可以在SharePoint本身中成功地针对此列表创建字段。
当我尝试在目标列表上创建字段时(引用上述通用列表中的查找值的列),问题就出现了。
我通过fieldCollection(xml, false, AddFieldOptions.AddToAllContentTypes)提交以下Xml。
<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。我还对使用命名引用的陷阱感兴趣。

1个回答

4
在使用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运算符,它挂在上下文中。这不是类型安全转换,您可以将任何字段转换为任何其他类型的字段,而且没有任何投诉。


非常有用!如果您想控制字段的StaticName,可以将其设置为DisplayName,然后Update(),再将显示名称设置为实际想要的内容并再次Update()。 DisplayName是必需的,因此您无法绕过它。 - SouthShoreAK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接