最近项目中遇到如何用代码给托管元数据类型的栏目赋值问题,经过折腾,现把我的思路和实现方法共享出来,让大家一起来学习学习。相互探讨下。
////// 托管元数据 /// public class SPTaxonomyEntity { ////// 托管元数据的guid /// public string Guid { get; set; } ////// 托管元数据的名称 /// public string Name { get; set; } }
#region//变量////// 子类托管元数据的集合对象/// private static Listtermcollection = new List ();#endregion
#region//私有方法 #region//给托管元数据类型赋值 ////// 给托管元数据类型赋值 /// /// 当前网站集 /// 当前列表 /// 当前列表项 /// 当前栏目显示名称 /// 节点元数据的名称 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//根据某个节点托管元数据的名称得到某个节点托管元数据对象 ////// 根据某个节点托管元数据的名称得到某个节点托管元数据对象 /// /// 当前网站集 /// 当前列表项 /// 当前栏目显示名称 /// 节点元数据的名称 ///返回某个节点托管元数据对象 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); //得到某个栏的所有托管元数据集合 Listalltax = 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// 取托管元数据的所有节点数据 /// /// 取托管元数据的所有节点数据 /// /// TermSet类型 ///返回数据集合 private static ListGetAllTerms(TermSet termSet) { //顶部TermSet数据集合 List parentcollection = new List (); //子类的Terms数据集合 List childcollection = new List (); // 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//取得子类托管元数据的集合 /// /// 取得子类托管元数据的集合 /// /// 子类对象 ///子类托管元数据的集合 private static ListGetChildTerms(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
最后写入的效果如下: