2013-08-02 44 views
2

我正在嘗試在使用CSOM的列表上創建查找字段。我在名爲「用戶狀態類型」的ListTemplateType.GenericList中定義了Lookup vales。這個設置看起來很好,我可以成功地在SharePoint本身的列表中創建該字段。通過CSOM創建SharePoint查找字段錯誤

當我嘗試在目標列表(引用上述通用列表中的查找值的列)上創建字段時,問題就出現了。

我提出通過fieldCollection下面的XML(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「值不在withing預期的範圍內。」

注意雖然通過友好名稱引用列表是理想的,但我也可以隨時快速訪問Guid。我也對使用命名參考的陷阱感興趣。

回答

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

非常有幫助!僅供參考,如果要控制字段的StaticName,可以將其設置爲DisplayName,Update(),然後將顯示名稱設置爲您實際希望的顯示名稱和Update()。 DisplayName是必需的,所以你無法繞過它。 – SouthShoreAK