我正在尝试使用CSOM在列表上创建查找字段。我在ListTemplateType.GenericList中定义了名为“用户状态类型”的Lookup vales。此设置显示正常,我可以在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。我也对使用命名引用的陷阱感兴趣。
答案 0 :(得分: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运算符。它不是类型安全的演员,你可以将任何领域投射到任何其他类型的领域,并且没有抱怨。