构造块:列和字段类型

上次修改时间: 2010年7月8日

适用范围: SharePoint Foundation 2010

本文内容
列和字段类型的对象模型
XML 用于列和字段类型
与列和字段类型开发相关的部分
有关列和字段类型开发的详细信息

本主题概述在 Microsoft SharePoint Foundation 中作为开发构建基块的列和字段类型。

提示提示

"字段"一词在 SharePoint Foundation 开发中有两个关系非常密切的含义。有时它指的是列表中的列,但如果提到单个列表项,"字段"一词的意思与"单元格"很接近,这里的单元格是表中某一列和某一行相交的部分。在一定程度上由于这一原因,"列"和"字段"在 SharePoint Foundation 开发中实际上是同义词。例如,表示一个列的对象就是 SPField 类或该类中派生的某个类的对象。

在 SharePoint Foundation 中,列不仅包含特定数据类型的数据,列本身也是一种类型,因为同一列可用于具有不同数据的多个列表。列可以保存在网站栏库中。通过编程或用户界面 (UI) 可将库中的网站栏添加到网站中的任何列表。通过编程或用户界面(例如,内容类型设计器)还可以将列添加到内容类型。

在 SharePoint Foundation 中内置的某些网站栏包括"地址"、"生日"、"助理姓名"和"URL"。每一列都属于一小组这种或那种类型的集合,有时称为"种类",但更多时候称为"字段类型"。例如,"地址"、"生日"、"助理姓名"和"URL"的字段类型分别是"多行文本"、"日期和时间"、"单行文本"和"超链接"。字段类型的整个列表是由 SPFieldType 枚举的值指定的。有些最重要的值包括:

  • Boolean – 只接受 true 或 false 为值的字段。

  • Calculated – 其值是在运行时使用数学公式计算出来的字段。

  • Choice – 只能有一个值并且该值必须包括在有限枚举值列表中的字段。还有一种 Multichoice 字段类型,允许从列表中取多个值。

  • Computed – 其值依赖于同一个列表项中另一个字段值的字段。它通常是对一个或多个其他字段执行的逻辑操作的值。

  • Lookup – 该字段类似于 Choice 字段,但它的可能值列表来自某个其他列表上的某一列。

  • Text – 接受单行文本的字段。还有多行文本字段类型。

下面是可通过编程或使用 XML 标记对字段执行的一些最有意义的操作:

  • 读取或写入特定列表项中特定字段的值。

  • 在列表中添加和删除列。

  • 在网站栏库中添加或删除列。

  • 更改字段在新建列表项、编辑列表项和显示列表项表单中呈现的方式。

  • 更改列在列表视图中呈现的方式。

  • 创建自定义字段类型。

  • 创建一个或多个自定义呈现控件来呈现各种网页和表单的字段。

  • 创建一个或多个移动呈现控件以在移动设备上呈现字段。

  • 从查询结果中排除不需要的列。

  • 当一个表有查询其他表的查询列时,在查询中执行两个表的合并。

列和字段类型的对象模型

备注

本主题主要指的是 SharePoint Foundation 服务器对象模型中的类。对于这些服务器类中的大多数类,客户端对象模型有并行的类。通常(但不是完全普遍适用),当服务器类名称以"SP"开头时,并行对象类具有相同的名称,但没有"SP"前缀。

SPListItem 索引器

SharePoint Foundation 开发中最常见的编码任务之一就是读取和写入列表项中的字段。为此,获取对表示列表项的 SPListItem 对象的引用,然后使用其索引器之一 (Item) 来引用特定字段。有一个索引器接受 Int32 对象,另一个索引器接受 String 对象,第三个索引器接受 Guid 对象。最后一个索引器可用于通过其 Id 属性获取字段。您可以使用 String 索引器传递字段的内部名称或其显示名称。

SPField 及其派生类

每个字段类型均由派生自 SPField 的类来表示。例如,SPFieldBoolean 表示 Boolean 字段,SPFieldChoice 表示 Choice 字段。网站的网站栏库中的任何指定列都是其中某个类的对象。类的属性能够区分指定字段类型的各个列。例如,"生日"列和"到期日期"列都是 SPFieldDateTime 类的对象,但它们的 Title 属性值与其他列的不同。SPField 类的成员是 ListsFieldUsedIn() 属性,该属性报告哪些列表包括该列。而且它还具有 EnforceUniqueValues 方法,可确保列中任何两个单元格都不具有相同的值,另外还具有 FilterableSortable 属性。

SPField 类的关键成员是 Update() 方法。必须调用该方法来保存对列所做的更改。

提示提示

每个 SPField 派生的类都有一些成员表明,其对象表示列表项中的特定字段;也就是说,会在列表视图中对应于列中特定单元格的实体。例如,有 GetFieldValue(String) 方法和 HasValue(Object) 方法。还有当单个列表项在"新建"或"编辑"表单这样的表单上呈现时确定字段如何呈现的 FieldRenderingControl 属性。尽管在您使用这些成员时以这种方式想到 SPField 派生的对象是有帮助的,但要记住,该对象没有任何属性具有特定列表项中的字段的值,并且调用 SPField.Update() 方法不会保存对这样的值所做的更改。(FieldRenderingControl 属性中的对象没有这样的成员;具体来说是 ItemFieldValue 属性。)同样,GetFieldValue(String) 没有真正获取值;它只是将传递给它的值转换为参数。HasValue(Object) 只报告传递给它的对象是否为 null。当然,我们希望传递到任一方法的值是特定列表项中的字段的值;但程序员的责任就是以这种方式使用方法。读取和写入特定列表项中特定字段的数据是通过 SPListItem 对象使用索引器。

您可以通过从 SPField 派生新类或从一个继承于它的类派生新类,来创建自己的自定义字段类型。有关详细信息,请参阅如何:创建自定义字段类

备注

不是所有从 SPField 继承的类都可以用作自定义字段类型类的基类。有关 Microsoft 支持派生的类的列表,请参阅如何:创建自定义字段类

BaseFieldControl 及其派生类

在"新建项"和"编辑项"表单(有时是"显示项"表单)上,字段在特定列表项中的呈现通常是由从 BaseFieldControl 派生的类的对象管理的。例如,SPFieldBoolean 对象是通过 BooleanField 类的对象呈现的,SPFieldUrl 对象是通过 UrlField 类的对象呈现的。

对呈现控件进行实例化的对象在其 Field 属性中保留对它所呈现的字段对象的引用。后者在其 FieldRenderingControl 属性中保留了对其呈现控件的引用。正如这些相互引用所显示的那样,这两个对象是成对出现的。SPField 派生的对象处理列配置,而 BaseFieldControl 派生的呈现控件处理与用户的交互以及列表项字段在 UI 中的呈现。

呈现控件对象通过 ValueItemFieldValue 属性、UpdateFieldValueInItem() 方法和 OnLoad(EventArgs) 处理程序与内容数据库中的字段保持同步。在"编辑"表单上,ItemFieldValue 属性具有内容数据库中在表单上呈现的特定列表项里的字段值。在"新建"表单上,ItemFieldValue 具有默认值。OnLoad(EventArgs) 处理程序向 Value 属性分配 ItemFieldValue 属性的值。如果用户设置或更改表单上的值,UpdateFieldValueInItem() 方法将向 ItemFieldValue 属性分配 Value 属性的值。

您可以通过从 BaseFieldControl 类派生新类或从一个继承于它的类派生新类,来创建自定义字段呈现控件。有关详细信息,请参阅如何:创建字段呈现控件

呈现模板

创建和合成字段呈现控件的大部分工作(包括创建其子控件)是通过呈现模板完成的。每个呈现控件至少包含一个与其关联的呈现模板。RenderingTemplate 对象被定义为文件夹 %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\CONTROLTEMPLATES 里的 ascx 文件中的 RenderingTemplate 元素。呈现模板是通过它在呈现控件对象的 TemplateName 属性中的 ID 值来引用的。由于呈现模板完成了大部分呈现工作,CreateChildControls() 方法所要做的事情比以前的 Microsoft ASP.NET 控制类中少多了。通常,它只提供对子控件的最终收尾工作。例如,它可能将一个默认值分配给子控件(如果字段是在"新建项"表单上呈现的),或者将字段的当前值分配给"编辑项"表单上的子控件。

您可以创建自定义呈现模板以使其与自定义呈现控件一起使用。有关详细信息,请参阅如何:创建字段呈现模板

SPMobileBaseFieldControl 及其派生类

SharePoint Foundation 页面的移动设备版本上的字段呈现是由从 SPMobileBaseFieldControl 派生的类管理的。例如,SPFieldBoolean 对象是通过 SPMobileBooleanField 类的对象呈现的。您可以创建从这些类之一中派生的自己的移动字段呈现控件。

广义上来说,这些类为移动表单提供的功能与 BaseFieldControl 派生的类为非移动表单提供的一样。但是,在架构上有些不同:

自定义字段值类

如果您创建保留一种复杂数据的自定义字段类型,可能需要创建自定义字段值类。某些内置字段类型需要特殊的复杂值类型。例如,SPFieldLookup 字段类型的对象所取的值是通过 SPFieldLookupValue 类表示的特殊类型的值。有关创建自定义字段值类的详细信息,请参阅如何:创建自定义字段值类

ViewFieldsOnly 和 Joins

当您使用 SPQuery 对象来表示协作应用程序标记语言 (CAML) 查询时,可以使用 ViewFieldsViewFieldsOnly 属性来确保您的查询不必从内容数据库提取不需要的字段。如果您使用 LINQ to SharePoint 提供程序来查询列表数据,则 LINQ select 关键字可用于同样的用途。还有使您的查询能联接两个或多个列表的 Joins 属性。LINQ to SharePoint 提供程序也可以支持 join 关键字。有关详细信息,请参阅列出联接和投影

XML 用于列和字段类型

在列和字段类型的定义中涉及到大量的 XML 标记。

字段类型定义

字段类型的详细定义由作为主列表架构的一部分的 Field 元素提供。有关详细信息,请参阅 Field 元素(列表)。在将字段部署为功能的一部分时,会在清单文件中对功能使用此相同元素。有关详细信息,请参阅字段定义

字段类型 XML 和 XSLT 样式表

字段还必须在位于 %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\XML 中按 fldtypes*.xml 模式命名的文件中向 SharePoint Foundation 注册才能呈现。该文件的格式为字段类型 XML。这些注册中的此标记是更简单类型的字段类型定义。它报告字段类型的某些基本特征,并标识字段类型的程序集和托管类。(对字段类型定义的只读访问可通过 SPFieldTypeDefinition 类在对象模型中获得)。

在列表视图上,字段值由 XSLT 样式表呈现。每列顶部的标题也由 XSLT 样式表呈现。可为自定义字段创建 XSLT 样式表或创建该表以替代现有字段的标准呈现。所有样式表永久保存在 %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\LAYOUTS\XSL 中。

ASP.NET 用户控件

ASP.NET 用户控件是在 ascx 文件中定义的,这些控件在字段类型开发中具有两种用途。首先,在"显示"、"新建"和"编辑"表单上呈现字段,该过程由名为呈现控件(请参阅上文中的 BaseFieldControl 及其派生类)的用户控件和呈现模板来完成。呈现模板通过 %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\ControlTemplates 文件夹中 ascx 文件中的 <RenderingTemplate> 来定义。它在对象模型中由 RenderingTemplate 类表示。此类可在已模板化的用户控件的 ASP.NET 系统顶部为您提供易于使用的抽象层。有关呈现模板及其与呈现控件的关系的详细信息,请参阅呈现模板。其次,如果字段类型本身具有变量属性,而这些变量属性在包括该字段的不同列表中具有不同的值,则可在 ascx 文件中创建一个属性编辑控件作为用户控件。有关此任务的详细信息,请参阅自定义字段类型属性呈现

查询架构中的 Join 类型

协作应用程序标记语言 (CAML) 查询架构 包括 Join 元素(视图),它允许您将 CAML 查询中的列表联接起来(如果一个列表具有 Lookup 列,而该列在另一个列表中查找列)。此元素还允许在使用 LINQ to SharePoint 提供程序的 LINQ 查询中使用隐式和显式联接。

与列和字段类型开发相关的部分

构造块:列表和文档库

构建基块:内容类型

有关列和字段类型开发的详细信息

有关在开发项目中使用列和字段类型的广泛详细信息,请参阅列表表单自定义字段类型的节点中的 SharePoint Foundation 开发详解部分。有关移动设备呈现字段呈现功能开发的信息,请参阅如何:自定义移动页上的字段呈现

读取特定列表项中特定字段的值是基本 SharePoint 编程任务之一。有关详细信息,请参阅如何:读取列表项中字段的值

有关在 SharePoint Foundation 中查询数据的详细信息,请参阅查询和数据检索