最近项目中遇到如何用代码给托管元数据类型的栏目赋值问题,经过折腾,现把我的思路和实现方法共享出来,让大家一起来学习学习。相互探讨下。
/// <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
最后写入的效果如下: