MOSS2010中如何用代码给托管元数据类型的栏目赋值

最近项目中遇到如何用代码给托管元数据类型的栏目赋值问题,经过折腾,现把我的思路和实现方法共享出来,让大家一起来学习学习。相互探讨下。

 /// <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);
 
 

image

image

 

如果不是我这个情况,必须建立在其他单独的下面,那么代码部分可以改成如下:

SNAGHTML1a40861

 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

 

最后写入的效果如下:

image

image

posted @ 2012-12-06 17:02  love007  阅读(485)  评论(1编辑  收藏  举报