Программно установите таксономический элемент в элементе списка.

Ситуация:

У меня есть куча терминов в Term Store и список, который их использует.

Многие термины еще не использовались и пока недоступны в TaxonomyHiddenList. Если их еще нет, они не имеют идентификатора, и я не могу добавить их в элемент списка.

Существует метод GetWSSIdOfTerm on Microsoft.SharePoint.Taxonomy.TaxonomyField, который должен возвращать идентификатор термина для определенного сайта.

Это возвращает идентификаторы, если этот термин уже был использован и присутствует в TaxonomyHiddenList, но если он не возвращается, то возвращается 0.

Есть ли способ программно добавить термины в TaxonomyHiddenList или заставить это делать?

Ответ 1

Не используйте

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

потому что у вас будут ошибки, если вы хотите обходить этот элемент.

Для установки значения в поле таксономии вам нужно только:

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

Привет

Ответ 2

В случае использования

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

затем во время создания таксономииFieldValue

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);  

Ответ 3

В MSDN вы можете найти, как создать термин и добавить его в TermSet. Образец предоставляется из Описание класса TermSetItem. TermSet должен иметь метод CreateTerm (имя, lcid), унаследованный от TermSetItem. Поэтому вы можете использовать его в примере ниже инструкции 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();
    }
}