Программно установите таксономический элемент в элементе списка.
Ситуация:
У меня есть куча терминов в 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();
}
}