【问题标题】:SharePoint Online CSOM Site Column Default ValueSharePoint Online CSOM 网站列默认值
【发布时间】:2017-01-30 18:17:41
【问题描述】:

在 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 中的 Site Columns 下,但没有在 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

【问题讨论】:

    标签: c# sharepoint sharepoint-online csom


    【解决方案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 将更改传播到使用该字段的所有列表

    所以,替换:

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

    与:

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

    【讨论】:

    • 嗨瓦迪姆。这是一个很好的回应,感谢您也解释了我所缺少的。我现在可以在 TaxonomyHiddenList 中看到关联的项目,并且网站栏看起来很好,但是当我在继承网站栏的列表中创建一个新项目时,默认值仍然为空。我是否也需要针对列表/库执行此操作?
    • 您可能需要将方法Update 替换为UpdateAndPushChanges。有关更多详细信息,请按照更新的答案(更新部分)
    猜你喜欢
    • 2013-09-13
    • 2014-06-19
    • 2023-04-01
    • 2017-12-01
    • 2023-03-19
    • 2014-08-27
    • 2020-10-14
    • 1970-01-01
    • 2015-03-28
    相关资源
    最近更新 更多