2016-09-22 87 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

相关问题