C# SharePoint Online CSOM站点列默认值

C# SharePoint Online CSOM站点列默认值,c#,sharepoint,sharepoint-online,csom,C#,Sharepoint,Sharepoint Online,Csom,在SharePoint Online中,我在使用CSOM(C#)设置站点管理的元数据列默认值时遇到问题。为简洁起见,我的代码中没有包含异常处理。以下是我所拥有的: // 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

在SharePoint Online中,我在使用CSOM(C#)设置站点管理的元数据列默认值时遇到问题。为简洁起见,我的代码中没有包含异常处理。以下是我所拥有的:

// 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);
List myList=ctx.Web.Lists.GetByTitle(“我的列表”);
ctx.Load(myList);
ctx.ExecuteQuery();
TaxonomyField taxField=ctx.CastTo(myList.Fields.GetByTitle(“myMMColumnName”);
ListItemCreationInformation newItemInfo=新建ListItemCreationInformation();
ListItem newItem=myList.AddItem(newItemInfo);
newItem[“myMMColumnName”]=termField;
taxField.SetFieldValueByValue(新项目,术语字段);
本文使用.SetFieldValue方法,该方法在CSOM中不可用,因此我可能错误地假设.SetFieldValueByValue是可比较的

谢谢你的阅读

参考资料: Article-

属于
分类领域
类,它表示行:

Field taxColumn = (Field)ctx.Web.Fields.GetByTitle(taxFieldTitle);
需要替换为:

var taxColumn = ctx.CastTo<TaxonomyField>(ctx.Web.Fields.GetByTitle(taxFieldTitle));
注:用于 验证分类法字段值,该字段值依次包括 解析
WssId

更新

用于将更改传播到使用该字段的所有列表

因此,替换:

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


嗨,瓦迪姆。这是一个很好的回答,谢谢你也解释了我遗漏了什么。我现在可以在TaxonomyHiddenList中看到关联的项,并且站点列看起来很好,但是当我在继承站点列的列表中创建新项时,默认值仍然为空。我是否也需要针对列表/库实现此功能?您可能需要将方法
Update
替换为
UpdateAndPushChanges
。有关更多详细信息,请参见更新的答案(更新部分)
//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();
taxColumn.Update();
ctx.ExecuteQuery();
taxColumn.UpdateAndPushChanges(true);
ctx.ExecuteQuery();