2016-09-22 89 views
1

在SharePoint Online中,使用CSOM(C#)設置站點Managed Metadata列默認值時出現問題。爲了簡潔,我沒有在我的代碼中包含異常處理。下面是我有:SharePoint Online CSOM站點列默認值

// Code snippet for what I'm trying to achieve 
using (ClientContext ctx = NewCtx(SiteInfo.Url)) // NewCtx is just a static member I use to return a ClientContext object 
{ 
    Field taxColumn = (Field)ctx.Web.Fields.GetByTitle("myMMColumnName"); 
    ctx.Load(taxColumn); 
    ctx.ExecuteQuery(); 
    TaxonomyFieldValue termField = new TaxonomyFieldValue(); 
    termField.Label = "My MM Term"; 
    termField.TermGuid = "b269aef7-6f47-4b02-bf80-7edfb7166a30"; 
    termField.WssId = -1; 
    taxColumn.DefaultValue = value; 
    // Place holder for added code (see below) 
    taxColumn.Update(); 
    ctx.Load(taxColumn); 
    ctx.ExecuteQuery(); 
} 

值出現在網站下列UI,但沒有相關的項目在TaxonomyHiddenList,這是有道理的,因爲設置查找WssId爲「-1」不能解決創造因此,缺省值沒有查找,並且在列表和庫級別列中顯示爲空。

我發現的最接近的分辨率是一篇文章(雖然不是CSOM並在下面鏈接)建議創建一個「虛擬」列表項(針對正在使用MM列的列表)。這將觸發在TaxonomyHiddenList中創建該項目,但文章建議不提交「虛擬」項目創建。我也試過,但似乎沒有效果。這是我加入到在前面的代碼塊中提到的佔位符的代碼:

List myList = ctx.Web.Lists.GetByTitle("My List"); 
ctx.Load(myList); 
ctx.ExecuteQuery(); 
TaxonomyField taxField = ctx.CastTo<TaxonomyField>(myList.Fields.GetByTitle("myMMColumnName")); 
ListItemCreationInformation newItemInfo = new ListItemCreationInformation(); 
ListItem newItem = myList.AddItem(newItemInfo); 
newItem["myMMColumnName"] = termField; 
taxField.SetFieldValueByValue(newItem, termField); 

本文使用.SetFieldValue方法,這是不可用的CSOM所以我很可能錯誤地假定該.SetFieldValueByValue是可比。

感謝您的閱讀!

參考文獻: 第 - http://sharepointificate.blogspot.com/2014/04/setting-managed-metadata-column-default.html

回答

1

SetFieldValue Method屬於TaxonomyField類,這意味着行:

Field taxColumn = (Field)ctx.Web.Fields.GetByTitle(taxFieldTitle); 

需要被替換爲:

var taxColumn = ctx.CastTo<TaxonomyField>(ctx.Web.Fields.GetByTitle(taxFieldTitle)); 

TaxonomyField taxColumn = ctx.CastTo<TaxonomyField>(ctx.Web.Fields.GetByTitle(taxFieldTitle)); 

一旦TaxonomyField被初始化時,默認值可以被設置如下:

//get taxonomy field 
var taxColumn = ctx.CastTo<TaxonomyField>(ctx.Web.Fields.GetByTitle(taxFieldTitle)); 
ctx.Load(taxColumn); 
ctx.ExecuteQuery(); 
//initialize taxonomy field value 
var defaultValue = new TaxonomyFieldValue(); 
defaultValue.WssId = -1; 
defaultValue.Label = termLabel; 
defaultValue.TermGuid = termId.ToString(); 
//retrieve validated taxonomy field value 
var validatedValue = taxColumn.GetValidatedString(defaultValue); 
ctx.ExecuteQuery(); 
//set default value for a taxonomy field 
taxColumn.DefaultValue = validatedValue.Value; 
taxColumn.Update(); 
ctx.ExecuteQuery(); 

注:TaxonomyField.GetValidatedString method被用於分類字段值的 驗證其又包括 解決WssId值的

更新

使用Field.UpdateAndPushChanges method傳播changesto使用領域

因此,所有的名單,替換:

taxColumn.Update(); 
ctx.ExecuteQuery(); 

有:

taxColumn.UpdateAndPushChanges(true); 
ctx.ExecuteQuery(); 
+1

嗨瓦迪姆。這是一個很好的迴應,也感謝你解釋我錯過了什麼。現在我可以在TaxonomyHiddenList中看到關聯的項目,而站點列看起來很好,但是當我在繼承站點列的列表中創建新項目時,默認值仍然爲空。我是否也需要對列表/庫實現這一點? – feganmeister

+0

您可能需要用'UpdateAndPushChanges'替換'Update'方法。更多詳細信息請參閱更新後的答案(更新部分) –

+1

非常棒,所有工作都如您所願!謝謝Vadim = D – feganmeister

相關問題