• 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

  • 相关阅读:
    如何实现基于消息/传输安全验证机制下的windows身份验证过程、无任何验证
    利用WCF的callback机制开发一个简单的多人游戏模型
    WCF常见预绑定协议中各种安全模式(Message Security|Transport Security)所支持的客户端凭证验证类型汇总
    tornado+peeweeasync+peewee+mysql(一)
    IIS 内部运行机制
    IIS 7 托管管道模式 经典模式(Classic) 集成模式(Integrated) 分析与理解
    斐波那契查找算法
    进制间转换
    严版数据结构题集3.15
    (TOJ 4413)IP address
  • 原文地址:https://www.cnblogs.com/love007/p/2805381.html
Copyright © 2020-2023  润新知