最近项目中遇到如何用代码给托管元数据类型的栏目赋值问题,经过折腾,现把我的思路和实现方法共享出来,让大家一起来学习学习。相互探讨下。
/// <summary>
/// 托管元数据
/// </summary>
public class SPTaxonomyEntity
{
/// <summary>
/// 托管元数据的guid
/// </summary>
public string Guid
{
get;
set;
}
/// <summary>
/// 托管元数据的名称
/// </summary>
public string Name
{
get;
set;
}
}
#region//变量
/// <summary>
/// 子类托管元数据的集合对象
/// </summary>
private static List<SPTaxonomyEntity> termcollection = new List<SPTaxonomyEntity>();
#endregion
#region//私有方法
#region//给托管元数据类型赋值
/// <summary>
/// 给托管元数据类型赋值
/// </summary>
/// <param name="site">当前网站集</param>
/// <param name="list">当前列表</param>
/// <param name="listItem">当前列表项</param>
/// <param name="fieldDisplayName">当前栏目显示名称</param>
/// <param name="taxName">节点元数据的名称</param>
private static void SetTaxonomyValue(SPSite site, SPList list, SPListItem listItem, string fieldDisplayName, string taxName)
{
try
{
//得到值
SPTaxonomyEntity entity = GetCurrentTermToName(site, listItem, fieldDisplayName, taxName);
//赋值
if (entity != null && !string.IsNullOrEmpty(entity.Guid))
{
//得到字段
TaxonomyField taxonomyField = list.Fields[fieldDisplayName] as TaxonomyField;
//字段类型值
TaxonomyFieldValue taxonomyFieldValue = new TaxonomyFieldValue(taxonomyField);
//赋值
taxonomyFieldValue.TermGuid = entity.Guid.ToString();
taxonomyFieldValue.Label = entity.Name;
//最后赋值
if (!string.IsNullOrEmpty(taxonomyFieldValue.Label))
{
listItem[listItem.Fields[fieldDisplayName].InternalName] = taxonomyFieldValue;
}
}
}
catch (Exception ex)
{
MessageLog.WriteLog(DateTime.Now + "给托管元数据类型栏目[" + fieldDisplayName + "]赋值错误:" + ex.Message);
}
}
#endregion #region//根据某个节点托管元数据的名称得到某个节点托管元数据对象
/// <summary>
/// 根据某个节点托管元数据的名称得到某个节点托管元数据对象
/// </summary>
/// <param name="site">当前网站集</param>
/// <param name="listItem">当前列表项</param>
/// <param name="fieldDisplayName">当前栏目显示名称</param>
/// <param name="termName">节点元数据的名称</param>
/// <returns>返回某个节点托管元数据对象</returns>
private static SPTaxonomyEntity GetCurrentTermToName(SPSite site, SPListItem listItem, string fieldDisplayName, string termName)
{
//需要返回的对象
SPTaxonomyEntity result = new SPTaxonomyEntity();
try
{
//全局变量实例化
if (termcollection != null)
{
//移走数据
if (termcollection.Count > 0)
{
termcollection.Clear();
}
}
//得到某个栏目
TaxonomyField taxField = listItem.Fields[fieldDisplayName] as TaxonomyField;
// Get the taxonomy session for the current site
TaxonomySession taxSession = new TaxonomySession(site);
// Get the default term store object for this site.
TermStore taxTermStore = taxSession.DefaultSiteCollectionTermStore;
//得到TermSet
TermSet termSet = taxTermStore.GetTermSet(taxField.TermSetId); //得到某个栏的所有托管元数据集合
List<SPTaxonomyEntity> alltax = GetAllTerms(termSet);
//循环比较是否跟某个节点托管元数据的名称匹配
foreach (SPTaxonomyEntity tax in alltax)
{
//如果匹配则返回对象
if (tax.Name.Equals(termName))
{
result = tax;
break;
}
}
}
catch (Exception ex)
{
MessageLog.WriteLog(DateTime.Now + "取托管元数据错误数据:" + ex.Message);
}
//返回对象
return result;
}
#endregion #region// 取托管元数据的所有节点数据
/// <summary>
/// 取托管元数据的所有节点数据
/// </summary>
/// <param name="termSet">TermSet类型</param>
/// <returns>返回数据集合</returns>
private static List<SPTaxonomyEntity> GetAllTerms(TermSet termSet)
{
//顶部TermSet数据集合
List<SPTaxonomyEntity> parentcollection = new List<SPTaxonomyEntity>();
//子类的Terms数据集合
List<SPTaxonomyEntity> childcollection = new List<SPTaxonomyEntity>();
//
try
{
//如果不为kog
if (termSet != null)
{
//循环
foreach (Term term in termSet.Terms)
{
//SPTaxonomyEntity
SPTaxonomyEntity tax = new SPTaxonomyEntity();
//托管元数据的id
tax.Guid = term.Id.ToString();
//托管元数据的名称
tax.Name = term.Name;
//加入到父集合中去
parentcollection.Add(tax);
//递归子类的数据集合
childcollection = GetChildTerms(term);
}
//如果不为空才添加
if (childcollection != null)
{
//合并父子类数据集合,返回所有托管元数据集合
parentcollection.AddRange(childcollection);
}
}
}
catch(Exception ex)
{
MessageLog.WriteLog(DateTime.Now + "无法取到托管元数据的父数据:" + ex.Message);
}
//返回
return parentcollection;
}
#endregion #region//取得子类托管元数据的集合
/// <summary>
/// 取得子类托管元数据的集合
/// </summary>
/// <param name="itemTerm">子类对象</param>
/// <returns>子类托管元数据的集合</returns>
private static List<SPTaxonomyEntity> GetChildTerms(Term itemTerm)
{
try
{
//循环
foreach (Term childTerm in itemTerm.Terms)
{
//申明
SPTaxonomyEntity tax = new SPTaxonomyEntity();
//托管元数据的id
tax.Guid = childTerm.Id.ToString();
//托管元数据的名称,组合成路径格式保存
tax.Name = childTerm.GetPath();
//把路径格式化下
tax.Name = tax.Name.Replace(";", "/");
//加入子类集合
termcollection.Add(tax);
//递归继续得到所有子类
GetChildTerms(childTerm);
}
}
catch (Exception ex)
{
MessageLog.WriteLog(DateTime.Now + "无法取到托管元数据的子数据:" + ex.Message);
}
//返回
return termcollection;
}
#endregion
#endregion
调用方法:
我的托管元数据的如下结构图,建立在默认的那个大类下面,所以代码部分写成如下:
// Get the default term store object for this site.
TermStore taxTermStore = taxSession.DefaultSiteCollectionTermStore;
//得到TermSet
TermSet termSet = taxTermStore.GetTermSet(taxField.TermSetId);
如果不是我这个情况,必须建立在其他单独的下面,那么代码部分可以改成如下:
TaxonomySession taxonomySession = new TaxonomySession(site);
TermStore termStore = taxonomySession.TermStores["Managed Metadata Service"];
Group group = termStore.Groups["文档中心元数据"];
//**************公司
TermSet termSet = group.TermSets["公司"];
调用实例:
#region//更改托管元数据类型
//公司
SetTaxonomyValue(site, docList, docItem, "公司", "东莞公司");
//项目
SetTaxonomyValue(site, docList, docItem, "项目", "上海公司/项目1/我的项目");
//阶段
SetTaxonomyValue(site, docList, docItem, "阶段", "初步设计阶段Ⅳ");
//专业
SetTaxonomyValue(site, docList, docItem, "专业", "初步设计阶段Ⅳ");
#endregion
最后写入的效果如下: