Программно установить TaxonomyField для элемента списка - PullRequest
12 голосов
/ 30 апреля 2010

Ситуация:

У меня есть куча терминов в магазине терминов и список, в котором они используются.

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

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

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

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

Ответы [ 3 ]

8 голосов
/ 01 августа 2012

Не использовать

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

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

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

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

Привет

7 голосов
/ 10 сентября 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);  
5 голосов
/ 03 мая 2010

В 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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...