本节将讨论字段和字段引用间的区别。
栏是一个字段或一个字段引用
在各种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。
![](https://i-blog.csdnimg.cn/blog_migrate/764b0550147f722b070f9f0487a379d9.jpeg)