前言
本文完全原创,转载请说明出处,希望对大家有用。
在SharePoint开发中,通常我们会将数据存储在列表,文档库或者直接存到数据库。但涉及到数据的层级结构时,用列表等存储实现并不是一件简单的事情,这时候就可以使用SharePoint的另外一种存储数据的方式:托管元数据。
托管元数据为SharePoint提供了统一的术语库,企业用户可以将各种日常使用的术语存放在托管元数据。托管元数据的另外一个重要特点是树型结构,比较典型的应用时企业的组织架构,将企业组织架构按照层级结构存放到托管元数据中,通过遍历元数据树输出企业组织信息。
本文着重对开发过程中对托管元数据的操作进行总结,如何配置Managed Metadata Service(托管元数据服务)请查看官方文档,本文不做描述。
阅读目录
正文
在使用Managed Metadata前,我们先看一下数据的存储结构,在Managed Metadata中,结构类型分为Term Store(容器)、Group、Term set和Term。
它们的关系可以用下图表示:
Managed Metadata Service
- Term Store
- Group
- Term Set
- Term
- Term Set
- Group
Group节点只能创建Term Set节点,Term Set节点只能创建Term节点,Term节点可以继续创建Term子节点。
这就是Managed Metadata得数据存储结构,接下来看下如何管理元数据。
路径:Site Settings->Term store management
Term store management是SharePoint自带的托管元数据管理页面,打开Term store management
如图:
我们可以看到在当前的网站集中,有一个Managed Metadata Service(Term Store),在此节点下有5个子节点。
在虚线上方的是自定义的Group(Portal等),展开Portal Group后,如图:
可以看到在Portal节点下是Department等Term Set节点,再下一层就是Term节点,如在部门(Department)节点下存储各个部门,以及各部门下的子部门。
这是SharePoint server 2010自带的管理界面,这里我们为了说明元数据存储结构简单介绍一下,接下来是我们开发过程中真正使用元数据的方法。
using (SPSite site = new SPSite(SiteUrl)) { TaxonomySession taxonomySession = new TaxonomySession(site); TermStore termStore = taxonomySession.DefaultSiteCollectionTermStore; Group group = termStore.Groups[termgroup]; TermSet termSet = group.TermSets[termSet_Department]; }
代码解释:
TaxonomySession:获取当前网站集下的 TermStore上下文环境
TermStore->Group->TermSet:根据层级结构取得最终的termset
DefaultSiteCollectionTermStore:默认的TermStore,可以使用taxonomySession.TermStore[""]修改为指定的TermStore
获取TermSet后,就可以通过其Terms属性获取此节点下的所有Terms。
修改term数据
在读取termset以后,下一步尝试修改term,加入以下代码:
Term term= termSet.Terms["IT"]; term.Name = "MIT"; termStore.CommitAll();
代码解释:
获取名为“IT”的Term
现在将Name修改为MIT
提交所有更改
注意修改元数据需要有相应的权限,同时需要注意的是修改后由于TimerJob的原因,可能会有一些延迟。
if (!term.IsRoot) { Term parent = term.Parent; } TermCollection child_terms = term.Terms;
代码解释:
term.IsRoot:判断是否为根节点
term.Parent:如果非根节点,则找到上级节点
term.Terms:找到此节点下的所有下级节点
复制、合并、移动节点复制:
Term term= termSet.Terms["MIT"]; term.Copy(true); termStore.CommitAll();
Term.Copy方法会将此节点复制一份名称"Copy of MIT"为保存到当前的TermSet中,参数指定为true则复制会包括子节点。同样TermSet也可以复制,不需要指定参数,方法会自动将其中的子节点也复制,子节点是作为原节点的复用(Reuse)节点存在,复用节点可以通过Source属性访问原节点。
合并:
Term term = termSet.Terms["MIT"]; Term term4Merge=termSet.Terms["HR"]; term.Merge(term4Merge); termStore.CommitAll();
Merge方法只能针对同样是Source Term的2个节点,也就是说之前复制后的复用节点是不能合并的。上述代码会将term合并到term4Merge。
移动:
Term term = termSet.Terms["HR"]; Term term4Move=termSet.Terms["Account"]; term.Move(term4Move); termStore.CommitAll();
Move方法应该是最常用到的方法。
Term和Term Set都可以移动,Term可以移动到其他在此Term Store的Term节点或Term Set下,Term Set可以移动到此Term Store的Group节点下。
Move方法可以让用户更加自由的移动节点,假设有这样一个需求,用户需要维护企业组织架构,如上述事例中:HR部门需要移动到Account部门下。使用Move方法,可以方便的将HR部门的所有其他组织一起移动到Account部门节点下,免去了重复添加的过程。甚至可以在页面中以拖拽的方式实现,为用户呈现更加直观友好的页面。
TaxonomyHiddenList
在SharePoint站点中,有一个隐藏的TaxonomyHiddenList,可以通过/Lists/TaxonomyHiddenList/AllItems.aspx访问。TaxonomyHiddenList的item对应TaxonomyFieldType字段的值,TaxonomyFieldType字段被赋值后,就会对应的在TaxonomyHiddenList产生一条记录,用来记录TaxonomyField的详细信息,所以TaxonomyFieldType字段也是LookUp字段类型。
自定义TaxonomyFieldType字段
在SharePoint界面中新建TaxonomyFieldType字段无其他需要注意的,主要看下在SharePoint项目中新建TaxonomyFieldType字段。
以下是TaxonomyFieldType字段的定义:
<Field ID="{47539D90-EB9B-45A5-8591-68077530FD92}" Name="Field_TaxonomyDemo" StaticName="Field_TaxonomyDemo" DisplayName="TaxonomyDemo" Required="FALSE" Group="Custom group" Type="TaxonomyFieldType"> <Customization> <ArrayOfProperty> <Property> <Name>TextField</Name> <Value xmlns:q6="http://www.w3.org/2001/XMLSchema" p4:type="q6:string" xmlns:p4="http://www.w3.org/2001/XMLSchema-instance">{78FF1668-CDDB-4645-8BED-FC2179944F5F}</Value> </Property> </ArrayOfProperty> </Customization> </Field> <Field ID="{78FF1668-CDDB-4645-8BED-FC2179944F5F}" Name="Field_TaxonomyDemoTaxHTField0" Type="Note" DisplayName="TaxonomyDemoTaxHTField0" StaticName="Field_TaxonomyDemoTaxHTField0" ShowInViewForms="FALSE" Required="FALSE" Hidden="TRUE" CanToggleHidden="TRUE"/>
Field_TaxonomyDemo字段这个字段是TaxonomyFieldType类型,需要注意的是在此字段中,需要引用下面的Field_TaxonomyDemoTaxHTField0字段作为其TextField属性字段。
总结
作为数据管理的一种方法,个人认为SharePoint Managed Metadata好处多多,在实际应用中也有很多方便之处。
SharePoint Managed Metadata的总结大概就是这些了,希望对读者有所帮助,有任何疑问请及时与我讨论。