前言
本文完全原創,轉載請說明出處,希望對大家有用。
在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的總結大概就是這些了,希望對讀者有所幫助,有任何疑問請及時與我討論。