本節將討論欄位和欄位引用間的區別。
欄是一個欄位或一個欄位引用
在各種WSS 3.0架構(如網站,列表或內容類型定義)中,欄可以用Field元素或FieldRef元素(內容類型)來表示。
網站和列表欄在網站和列表定義中以Field元素來表示。然而,在內容類型定義裡網站和列表欄的引用是用FieldRef元素來表示的。同理,網站和列表欄在網站和列表物件模型中用SPField對象來表示,而在內容類型中引用的網站或列表欄用SPFieldLink對象來表示。
Field元素包含了對網站或列表欄的完整定義。
FieldRef元素是對別處定義的欄的一個引用,無論是在網站或列表層級。在欄位引用中,我們可以覆蓋一小部分欄屬性,如:
- 顯示名稱
- XML升級和降級屬性
- 欄位是否可選,必需,或隱藏
在欄位引用中對這些屬性的更改僅僅應用於包含該欄位引用的特定內容類型。
將欄添加到列表
我們可以將網站欄想象成模板;我們在網站層級建立網站欄,然後可以將其應用到所需的列表和子網站。
當我們將欄添加到列表,該欄的定義被拷貝到列表中,成為一個列表欄。因此,在列表架構中,列表欄此時用Field元素表示。在物件模型裡用SPField對象表示。
同樣,當我們將網站欄添加到列表中時,結果清單欄具有與網站欄相同的欄位ID。WSS用該ID來跟蹤那些列表欄是給定網站欄的“孩子”。這樣當我們更改網站欄後就可以將變更傳播到所有該網站欄的子代列表欄。
我們也可以在列表層級建立欄。這些欄僅用於當前列表。我們僅可以將該欄添加到當前列表的內容類型中。在列表架構中該列表欄同樣用Field元素表示,物件模型也對應SPField對象。因為他並不是來源於其他欄,所以也沒有和任何欄之間d的父子關係。
在內容類型中引用欄
如果需要在內容類型裡跟蹤特定項目的中繼資料,我們可以引用一個表示該中繼資料的欄。然而,我們不能在內容類型中建立欄;我們必須先建立欄然後再內容類型定義中引用他。因此,當我們添加欄到內容類型時,該內容類型架構並不包含Field元素;而是包含了一個FieldRef元素。對於網站和列表欄來說都是如此。
一個欄位引用保留了與所引用欄位相同的欄位ID。
如果我們建立的內容類型是基於一個父內容類型,預設情況下所有的父級欄的引用在子級內容類型中都用FieldRef元素表示。
當我們將內容類型添加到列表時,內容類型中引用的欄會拷貝到列表中變為列表欄。內容類型中各FieldRef元素在拷貝到列表架構中時變成Field元素,並與網站欄間保持父子關係。
當我們在列表內容類型中引用列表欄,該欄會以FieldRef元素方式添加到列表內容類型架構中。
因此,欄在網站和列表架構中始終用Field元素表示,而在內容類型架構中始終以FieldRef元素來表示。
內容類型中的欄位引用在WSS 3.0物件模型中用SPFieldLink對象表示。
展示了這種關係。假設我們在內容類型中引用了網站欄Author。在內容類型架構中,該欄的參考資料表現為FieldRef元素。當我們在列表中添加該內容類型後,WSS將Author欄添加為Field元素。兩個元素具有與Author網站欄相同的欄位ID。當我們在內容類型中引用ItemNo列表欄後,WSS將其添加為FieldRef元素,也是用相同的欄位ID。