【问题标题】:Programmatically set a TaxonomyField on a list item以编程方式在列表项上设置分类字段
【发布时间】:2011-02-14 07:17:10
【问题描述】:

情况:

我在术语库中有一堆术语和一个使用它们的列表。

许多术语尚未使用,并且在 TaxonomyHiddenList 中尚不可用。 如果它们不存在,则它们没有 ID,我无法将它们添加到列表项中。

Microsoft.SharePoint.Taxonomy.TaxonomyField 上有一个方法 GetWSSIdOfTerm,它应该返回特定网站的术语 ID。

如果该术语已被使用并且存在于 TaxonomyHiddenList 中,则返回 ID,但如果不是,则返回 0。

有没有办法以编程方式将术语添加到 TaxonomyHiddenList 或强制它发生?

【问题讨论】:

    标签: sharepoint sharepoint-2010


    【解决方案1】:

    在 MSDN 上,您可以找到如何创建 Term 并将其添加到 TermSet。样品由TermSetItem class description 提供。 TermSet 应该有一个从 TermSetItem 继承的 CreateTerm(name, lcid) 方法。因此,您可以在下面的示例 int catch 语句中使用它,即:

    catch(...)
    {
       myTerm = termSet.CreateTerm(myTerm, 1030);
       termStore.CommitAll();
    }
    

    至于将术语分配给列表,此代码应该可以工作(我不确定“标签”字段的名称,但是很容易找到分类字段的正确内部名称):

    using (SPSite site = new SPSite("http://myUrl")) 
    {
        using (SPWeb web = site.OpenWeb())
        {
            string tagsFieldName = "Tags";
            string myListName = "MyList";
            string myTermName = "myTerm";
    
            SPListItem myItem = web.Lists[myListName].GetItemById(1);
            TaxonomyField tagsField = (TaxonomyField) myList.Fields[tagsFieldName];
            TaxonomySession session = new TaxonomySession(site);
            TermStore termStore = session.TermStores[tagsField.SspId];
            TermSet termSet = termStore.GetTermSet(tagsField.TermSetId);
            Term myTerm = null;
    
            try
            {
                myTerm = termSet.Terms[myTermName];
            }
            catch (ArgumentOutOfRangeException)
            {
                // ?
            }
    
            string termString = String.Concat(myTerm.GetDefaultLabel(1033),
                                                TaxonomyField.TaxonomyGuidLabelDelimiter, myTerm.Id);
    
            if (tagsField.AllowMultipleValues)
            {
                TaxonomyFieldValueCollection tagsValues = new TaxonomyFieldValueCollection(tagsField);
                tagsValues.PopulateFromLabelGuidPairs(
                    String.Join(TaxonomyField.TaxonomyMultipleTermDelimiter.ToString(),
                                new[] { termString }));
                myItem[tagsFieldName] = tagsValues;
    
            }
            else
            {
                TaxonomyFieldValue tagValue = new TaxonomyFieldValue(termString);
                myItem[tagsFieldName] = tagValue;
            }
            myItem.Update();
        }
    }
    

    【讨论】:

    • tagsField.SetFieldValue(myItem , myTerm); myItem.Update() 这是最干净的方法。如果 SharePoint 团队更改其字符串格式等,上述内容可能会中断
    【解决方案2】:

    不要使用

    TaxonomyFieldValue tagValue = new TaxonomyFieldValue(termString);
    myItem[tagsFieldName] = tagValue;"
    

    因为你想爬取这个item的时候会出错。

    要在分类字段中设置值,您只需使用:

    tagsField.SetFieldValue(myItem , myTerm);
    myItem.Update();"
    

    问候

    【讨论】:

      【解决方案3】:

      万一使用

      string termString = String.Concat(myTerm.GetDefaultLabel(1033),
                                                  TaxonomyField.TaxonomyGuidLabelDelimiter, myTerm.Id);  
      

      然后在实例化 TaxonomyFieldValue 期间

      TaxonomyFieldValue tagValue = new TaxonomyFieldValue(termString);
      

      异常会抛出消息

      值不在预期范围内

      您还提供了 WssId 来构造术语字符串,如下所示

      // We don't know the WssId so default to -1
             string termString = String.Concat("-1;#",myTerm.GetDefaultLabel(1033),
                                                          TaxonomyField.TaxonomyGuidLabelDelimiter, myTerm.Id);  
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-08-04
        • 1970-01-01
        • 1970-01-01
        • 2013-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多