构造块:列和字段类型
上次修改时间: 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 方法,可确保列中任何两个单元格都不具有相同的值,另外还具有 Filterable 和 Sortable 属性。
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 中的呈现。
呈现控件对象通过 Value 和 ItemFieldValue 属性、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 派生的类为非移动表单提供的一样。但是,在架构上有些不同:
SPMobileBaseFieldControl 派生的类的继承树可追溯到 ASP.NET 的 Control 类,而不是 Control 类。而且,在该树的 SharePoint Foundation 部分以内,从非移动呈现控件中的 TemplateBasedControl 和 FormComponent 类继承的函数将在用于移动呈现控件的 SPMobileComponent 类中结合。
移动呈现控件有自己的一组呈现模板,如果您创建了自定义呈现模板以便在非移动页面上使用,就可能需要创建一个不同的模板以便在移动页面上使用。
与您为非移动上下文创建的自定义字段呈现控件相比,您为移动上下文创建的自定义字段呈现控件更依赖于控件的 CreateChildControls() 方法来呈现字段,而相对不太依赖于程序模板。此外,在创建自定义移动呈现控件时,您不会经常重写 CreateChildControls() 方法本身。通常您会重写通过 CreateChildControls():CreateControlForDisplay()、CreateControlForEdit()、CreateControlForNew() 和 CreateControlForView() 调用的四个其他方法之一。
对移动呈现控件进行实例化的对象在其 Field 属性中保留对它所呈现的字段对象的引用。后者在其 FieldRenderingMobileControl 属性中保留对其移动呈现控件的引用。如果成员是在保持内容数据库和呈现控件同步的过程中涉及的,则这些成员在 SPMobileBaseFieldControl 派生的类中,与其在上述 BaseFieldControl 派生的类中,表现略有不同。
有关移动页面上的字段呈现的详细信息,请参阅如何:自定义移动页上的字段呈现。
自定义字段值类
如果您创建保留一种复杂数据的自定义字段类型,可能需要创建自定义字段值类。某些内置字段类型需要特殊的复杂值类型。例如,SPFieldLookup 字段类型的对象所取的值是通过 SPFieldLookupValue 类表示的特殊类型的值。有关创建自定义字段值类的详细信息,请参阅如何:创建自定义字段值类。
ViewFieldsOnly 和 Joins
当您使用 SPQuery 对象来表示协作应用程序标记语言 (CAML) 查询时,可以使用 ViewFields 和 ViewFieldsOnly 属性来确保您的查询不必从内容数据库提取不需要的字段。如果您使用 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 中查询数据的详细信息,请参阅查询和数据检索。