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

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

最后写入的效果如下:

MOSS2010中如何用代码给托管元数据类型的栏目赋值的更多相关文章

  1. android中如何用代码来关闭打开的相机

    场景描述: 比如你再应用中打开了系统相机,然后需要在几分钟后自动关闭这个系统相机(不是手动关闭) 1.在activityA中利用startActivityForResult(intent,reques ...

  2. WPF中如何用代码触发按钮Click处理

    btnOk.RaiseEvent(new RoutedEventArgs(Button.ClickEvent));

  3. Unity3D除了在编辑器里,怎么用代码给一个Texture类型的变量赋值

    resource.load上来一张贴图就行. using UnityEngine; using System.Collections; public class example : MonoBehav ...

  4. ZH奶酪:PHP中添加HTML代码的三种方法

    php中添加HTML代码,就是php类型的文件中添加html代码~ 第一种是在HTML中加PHP. 大段大段的html代码中,在各个需要执行php的地方<?php .... ?> 比如 l ...

  5. php中嵌套html代码和html代码中嵌套php方式

    php中嵌套html代码和html代码中嵌套php方式 一.总结 拷贝的话直接html代码是极好的方式 1.php中嵌套html代码(本质是原生php):a.原生嵌套<?php .....?&g ...

  6. Salesforce 自定义元数据类型

    自定义元数据类型的优点 Salesforce中的设定都是以元数据(Metadata)存在的.在Salesforce中,用户可以新建自定义对象.自定义字段等,这些数据结构都以元数据的形式存储在系统中.当 ...

  7. 一步一步学Silverlight 2系列(22):在Silverlight中如何用JavaScript调用.NET代码

    概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...

  8. Excel 2003 中如何用VBA 代码访问单元格里的值及操作单元格 - 唐诗宋词的专栏 - 博客频道 - CSDN.NET

    在Excel 中编写VBA 代码,最常做的事可能就是操作表单中单元格里的数据. 我这里总结一下如何从VBA 代码中操作单元格的数据. 在VBA 代码中操作单元格需要用到Range 对象,Range 是 ...

  9. ng1中 如何用双向绑定 实现单向绑定的初始时不显示双括号效果?

    ng1中 如何用双向绑定 实现单向绑定(ng-bind就可以不显示{{}})的初始时不显示双括号效果? AngularJS 实例 页面加载时防止应用闪烁: <div ng-app="& ...

随机推荐

  1. C++变量作用域、生存期、存储类别

    写C.C++代码的小伙伴一定在头疼变量的作用域.生存期.存储类别问题.什么静态.外部.寄存器.局部.全局搞得一头雾水.今天咱们就来梳理一下他们的变态关系(什么不得了的事情???) 1.变量的作用域 说 ...

  2. springboot整合activemq(二),消费均匀分析

    问题分析:当如果多个消费者是什么情况呢 topic消费是友多个消费者的,是支持的,但是queue是支持,但是不能保证多个消费均匀消费,在分布式环境下怎么操作呢: 看案例: 在前面整合代码执行: 浏览器 ...

  3. clojure with postgres

    主要关注访问pg.不关心其他db 1 clojure.java.jdbc https://github.com/clojure/java.jdbc http://clojure-doc.org/art ...

  4. SoapUI Properties的使用

    Link:http://testautomationnoob.blogspot.com/2012/10/soapui-properties-and-property-related.html soap ...

  5. 【SSO】单点登录系统

    一.单点登录系统介绍 对于一个开发项目来说,每个项目都必不可少要有登录的这个功能.但是随着项目的变大,变大,再变大.系统可能会被拆分成多个小系统,咱们就拿支付宝和淘宝来说,咱们在淘宝上购物,然后就可以 ...

  6. vscode 配置 java utf-8 编码

    utf-8 编码 和 lombok 的 配置 "java.jdt.ls.vmargs": "-noverify -Xmx1G -XX:+UseG1GC -XX:+UseS ...

  7. C语言中的预处理命令

    预处理功能是C语言的重要功能. 问:为什么要预处理,什么是预处理? 答:我们知道高级语言的运行过程是通过编译程序(编译器)把源代码翻译成机器语言,实现运行的.编译程序的工作包含:语法分析.词法分析.代 ...

  8. echarts设置线条粗细

    series: [ { name:"buy", type:'line', data:[], itemStyle: { normal: { color: '#6cb041', lin ...

  9. 关于django的模板层

    你可能已经注意到我们在例子视图中返回文本的方式有点特别. 也就是说,HTML被直接硬编码在 Python代码之中. def current_datetime(request): now = datet ...

  10. 小白零基础C#学习笔记

    一.概述 1..Net 1)..Net平台 2)..Net Frameword框架 说明:是.Net平台中不可缺少的一部分,提供了一个稳定的运行环境来保证.Net平台开发的各种应用能够正常运转. 2. ...