Программно установить TaxonomyField в элементе списка

Ситуация:

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

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

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

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

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


person Mel Gerats    schedule 30.04.2010    source источник


Ответы (3)


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

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

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

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

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

С уважением

person Fab    schedule 01.08.2012

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

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);  
person Vadim Gremyachev    schedule 10.09.2012

В MSDN вы можете найти, как создать термин и добавить его в TermSet. Пример взят из описания класса TermSetItem. TermSet должен иметь метод CreateTerm(name, 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();
    }
}
person Gutek    schedule 03.05.2010
comment
tagsField.SetFieldValue(myItem, myTerm); myItem.Update() Это самый чистый способ. Вышеприведенное может сломаться, если команда SharePoint изменит свои форматы строк и т. д. - person statto; 18.03.2013