0

I am trying to upload a document in a Document library of SharePoint online site by client object model .net managed code. But keyword column in the document library is not being updated for microsoft office files only. it doesn't throw any error and the code works fine but the keyword column is not being updated.

I am passing following values to keyword column:

listItem.File.ListItemAllFields["TaxKeyword"] = "21;#five|850EC37A-71D1-44DE-A175-AF51FBB5AE7E";

listItem.File.ListItemAllFields["TaxKeywordTaxHTField"] = "21;#five|850EC37A-71D1-44DE-A175-AF51FBB5AE7E";

ofile.ListItemAllFields.Update();

clientContext.ExecuteQuery();

Help. Thanks, Nidhi Mohan

1 Answers1

0

Since Enterprise Keywords is a Microsoft.SharePoint.Client.Taxonomy.TaxonomyField use TaxonomyField.SetFieldValueByValueCollection method to set taxonomy field value using SharePoint 2013 CSOM.

How to set Enterprise Keywords taxonomy field value using SharePoint CSOM

Since Taxonomy API is supported in SharePoint 2013 CSOM, the following example demonstrates how to set Enterprise Keywords field value:

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.SharePoint.Client;
using Microsoft.SharePoint.Client.Taxonomy;

namespace SharePoint.Client.Taxonomy
{
    /// <summary>
    /// Enterpise Keyword Manager
    /// </summary>
    public class KeywordsManager
    {

        /// <summary>
        /// Set Enterprise Keyword Value
        /// </summary>
        /// <param name="item">List Item</param>
        /// <param name="values">Keyword values</param>
        public static void SetTaxKeywordValue(ListItem item,string[] values)
        {
            var ctx = item.Context;
            var list = item.ParentList;
            var field = list.Fields.GetByInternalNameOrTitle(TaxKeywordFieldName);
            var taxKeywordField = ctx.CastTo<TaxonomyField>(field);
            var keywords = values.Select(value => EnsureKeyword(taxKeywordField, value)).ToList();
            taxKeywordField.SetFieldValueByValueCollection(item, new TaxonomyFieldValueCollection(ctx, GetTermsString(keywords), taxKeywordField));    
        }


        /// <summary>
        /// Ensure Keyword 
        /// </summary>
        /// <param name="taxField"></param>
        /// <param name="name"></param>
        /// <returns></returns>
        private static Term EnsureKeyword(TaxonomyField taxField, string name)
        {
            var ctx = taxField.Context;
            var taxSession = TaxonomySession.GetTaxonomySession(ctx);
            var termStore = taxSession.GetDefaultKeywordsTermStore();
            var keywords = termStore.KeywordsTermSet.GetAllTerms();
            var result = ctx.LoadQuery(keywords.Where(k => k.Name == name));
            ctx.ExecuteQuery();
            var keyword = result.FirstOrDefault();
            if (keyword != null)
            {
                return keyword;
            }
            keyword = termStore.KeywordsTermSet.CreateTerm(name, DefaultLanguage, Guid.NewGuid());
            ctx.Load(keyword);
            ctx.ExecuteQuery();
            return keyword;
        }

        /// <summary>
        /// Retrieve formatted Term string
        /// </summary>
        /// <param name="term"></param>
        /// <returns></returns>
        private static string GetTermString(Term term)
        {
            return string.Format("-1;#{0}{1}{2}", term.Name, TaxonomyGuidLabelDelimiter,term.Id);
        }

        private static string GetTermsString(IEnumerable<Term> terms)
        {
            var termsString = terms.Select(GetTermString).ToList();
            return string.Join(";#", termsString);
        }



        private const string TaxKeywordFieldName = "TaxKeyword";

        private const int DefaultLanguage = 1033;

        private const string TaxonomyGuidLabelDelimiter = "|";
    }
}

Usage

using (var ctx = new ClientContext(webUri))
{
    var list = ctx.Web.Lists.GetByTitle(listTitle);
    var item = list.GetItemById(itemId);
    KeywordsManager.SetTaxKeywordValue(item,new []{"2013","2010"});
    item.Update();
    ctx.ExecuteQuery();
}

For a more details please follow Enterprise Keywords management in Office 365 via CSOM post.

Vadim Gremyachev
  • 57,952
  • 20
  • 129
  • 193