情况:
我在Term Store中有一堆术语和一个使用它们的列表。
许多术语尚未使用,但在TaxonomyHiddenList中尚未提供。 如果他们还没有,那么他们没有ID,我也无法将它们添加到列表项中。
GetWSSIdOfTerm
上有一个方法Microsoft.SharePoint.Taxonomy.TaxonomyField
,它应该返回特定网站的字词ID。
如果该术语已经被使用并且存在于TaxonomyHiddenList中,则返回ID,但如果不是,则返回0。
有没有办法以编程方式将术语添加到TaxonomyHiddenList或强制它发生?
答案 0 :(得分:8)
不要使用
TaxonomyFieldValue tagValue = new TaxonomyFieldValue(termString);
myItem[tagsFieldName] = tagValue;"
因为当您要抓取此项时会出现错误。
要在分类法字段中设置值,您只需使用:
tagsField.SetFieldValue(myItem , myTerm);
myItem.Update();"
此致
答案 1 :(得分:7)
如果使用
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);
答案 2 :(得分:5)
在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();
}
}