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

标签 c# sharepoint-2010 sharepoint-2013 csom

我正在尝试使用 CSOM 在列表中创建查找字段。我在名为“用户状态类型”的 ListTemplateType.GenericList 中定义了查找值。此设置看起来很好,我可以在 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。我也对使用命名引用的陷阱很感兴趣。

最佳答案

在这种使用 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 运算符卡在上下文之外。它不是类型安全的转换,您可以将任何字段转换为任何其他类型的字段并且没有任何提示。

关于c# - 通过 CSOM 错误创建 SharePoint 查找字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18023860/

相关文章:

c# - Windows Phone 7 - iCal 生成器 - C#

c# - WPF RichTextBox 增量字体大小

c# - 使用 C# 从 SharePoint (CSOM) 下载特定文件

c# - 将自定义类型的变量传递给自定义 MSBuild 任务

c# - FileHelpers -- 只读取第 N 列

c# - 对 SharePoint 列表项目重新排序的最佳方法是什么?

sharepoint-2010 - SharePoint CAML 查询 AND/OR 运算符

sharepoint - SharePoint 列表可以有多少个事件接收器?

javascript - 如何阻止特定 Sharepoint 页面的身份验证