构建基块:内容类型

上次修改时间: 2011年5月27日

适用范围: SharePoint Foundation 2010

本文内容
内容类型的对象模型
用于内容类型的 XML
与内容类型相关的领域
有关内容类型的详细信息

在 SharePoint Online 中提供

内容类型 定义 SharePoint Foundation 列表或文档库中项目类别的元数据、工作流和行为。例如,可以定义"费用报表"内容类型,以便始终使用特定的 Microsoft Excel 模板创建费用报表文档,并且审批工作流始终在提交新费用报表时自动启动。如果您随后向文档库中添加内容类型,则通过在库中从附加到"新建文档"按钮的菜单中选择"费用报表",用户即可创建并提交新费用报表。

内容类型提供的主要好处是使您能够以集中且可重用的方式管理特定信息类别的基础架构。内容类型在网站级别定义,它独立于网站中的任何列表或文档库。可以对网站中众多不同的列表或文档库使用相同的内容类型;在某些情况下,可以对整个网站集中的列表和库使用一种内容类型。反之,也可以对同一列表或库使用几种不同的内容类型。当一个列表或文档库支持多个内容类型时,每个内容类型均会显示在"新建"按钮上,并且都具有唯一的一组列、工作流和行为。

内容类型的可用性称为范围。内容类型的范围始终包括定义内容类型的网站以及该网站的每个子网站。例如,假定有这样一个网站层次结构,名为"欧洲"的父网站具有名为"意大利"、"法国"和"德国"的子网站。添加到"欧洲"父网站中的新内容类型可以应用于"欧洲"、"意大利"、"法国"和"德国"网站中的列表或文档库。因为范围通过网站层次结构向下扩展,所以向网站集的根网站中添加内容类型将使内容类型可用于网站集中的列表和库。

内容类型是使用继承原则定义的。您无需从头开始创建内容类型。而是可以选择现有内容类型作为要创建的任何新内容类型的基础。将现有内容类型作为新内容类型的基础后,新内容类型将继承父内容类型的元数据、工作流和行为。这样,您即可定义基础内容类型,就像定义基类一样。例如,您可以定义名为"Financial Document"的内容类型,它具有组织中所有财务文档共有的特征。然后可以将"Financial Document"作为两个新内容类型("Invoice"和"Purchase Order")的基础。新内容类型将从"Financial Document"继承元数据和行为,因此您只需要在父内容类型中定义一次共有元素。

您可以在工作时查看此模式,方法是查看"网站设置"下的"网站内容类型"库。可以应用于列表的最基本内容类型称为项目。内容类型通知、联系人、任务和其他很多内容均继承自项目。同样,可以应用于文档库的最基本内容类型称为文档。内容类型图片、表单和 Wiki 网页均继承自文档。

注意,在创建新内容类型时,必须确定是要将其用于列表还是文档库。只有从文档继承的内容类型可以应用于文档库。此外,只有从项目(而不是文档)继承的项目类型可以应用于列表。

背离继承原则的一个重要表现是对父内容类型所做的更改不会自动传播到派生的内容类型。传播更改的方式与在 NTFS 中沿文件系统层次结构向下传播安全权限的方式相似。有关详细信息,请参阅更新子内容类型

内容类型的对象模型

SharePoint Foundation 具有丰富的对象模型,您可以使用它创建、查找、添加、更新和删除内容类型。如果要编写将在服务器上执行的代码,将使用 Microsoft.SharePoint 命名空间的成员。此命名空间中的大多数类型在 Microsoft.SharePoint.Client 命名空间中都具有等效项,您可以使用这些等效项编写将在客户端上执行的代码。

查找内容类型

您可以访问 SPWeb(服务器)对象或 Web(客户端)对象的 AvailableContentTypes 属性,以查找可在任何给定范围使用的内容类型。这两个属性都返回 SPContentType(服务器)或 ContentType(客户端)对象的只读集合。该集合可以枚举,还具有一些索引器,包括内容类型名称。

您可以在服务器代码中访问 SPList 对象的 ContentTypes 属性或者在客户端代码中访问 List 对象的同一属性,以查找列表或文档库已应用的内容类型。此属性返回已编制索引的可枚举集合,但是此处所述的集合是可写的。

应该注意,将网站内容类型应用于列表或文档库时,实际上并不是添加网站内容类型,而是网站内容类型的副本。此外,列表的内容类型副本具有不同的内容类型标识符。它从网站内容类型的标识符派生,但两种标识符并不完全相同。这意味着可能无法通过将内容类型标识符用作集合索引来检索所需的内容类型。应该改用集合的 BestMatch 方法。有关详细信息,请参阅网站和列表内容类型内容类型 ID

如果要了解网站内容类型的使用位置,可以对列表或另一网站内容类型的父项调用静态方法 GetUsages(SPContentType),它是 SPContentTypeUsage 类的成员。

创建新内容类型

可以创建自定义内容类型并将其部署为功能的一部分。有关功能的详细信息,请参阅构建基块:功能

将用于创建内容类型的代码放置在 SPFeatureReceiver 对象的 FeatureActivated(SPFeatureReceiverProperties) 方法中。如果内容类型使用新网站栏,则必须首先创建和设置栏,然后在内容类型中引用它们。有关栏的详细信息,请参阅构造块:列和字段类型

若要创建内容类型对象,可以调用 SPContentType 类的构造函数之一。两个构造函数都有一个参数是 SPContentTypeCollection 对象。它是在 SPWeb 对象(表示将在其中创建内容类型的网站)的 ContentTypes 属性中返回的对象。尽管在构造函数中指定了网站内容类型集合,但是构造函数并不将它添加到集合中。必须通过单独调用同一集合的 Add 方法来完成此操作。

添加和删除内容类型

若要将内容类型应用于列表或文档库,必须首先将列表的 AllowContentTypes 属性设置为 true,然后调用集合的 Add 方法,该集合在 SPList(服务器)对象或 List(客户端)对象的 ContentTypes 属性中返回。

若要将新内容类型添加到网站中,请调用集合的 Add 方法,该集合在 SPWeb(服务器)对象或 Web(客户端)对象的 ContentTypes 属性中返回。

若要从列表或文档库中删除内容类型,可以调用 Delete 方法,以传递标识要删除的内容类型的 SPContentTypeId(服务器)结构或 ContentTypeId(客户端)结构。但是,无法删除正在使用的内容类型。如果尝试从列表中删除内容类型,则必须先确保没有列表项使用该内容类型。一种实现方法是遍历列表中的项目,并查看每个项目的 ContentType 属性的值。如果要尝试从定义内容类型的网站集中删除该内容类型,应确保 GetUsages 方法返回空列表,即内容类型未在任何列表中使用,也不是任何子内容类型的父项。

更新内容类型

SharePoint Foundation 提供了一种机制,可用于通过表示内容类型的 SPContentType(服务器)和 ContentType(客户端)对象的 ReadOnly 属性和 Sealed 属性控制对内容类型的更改。您应该首先检查这些属性的设置,然后再尝试修改内容类型。有关详细信息,请参阅内容类型变更控制

将用于更新内容类型的代码放置在 SPFeatureReceiver 对象的 FeatureActivated(SPFeatureReceiverProperties) 方法中。代码完成对表示内容类型的对象的修改后,将调用对象的 Update() 方法的重载之一以将更改提交到数据库。您可以选择将更改向下推送到派生的内容类型。有关详细信息,请参阅更新子内容类型

用于内容类型的 XML

可以在功能中使用 XML 定义内容类型。有关用于内容类型定义的架构的信息,请参阅内容类型定义。可以在设置列表时将现有内容类型添加到该列表中。有关列表架构的内容类型部分的信息,请参阅ContentTypes 元素(列表)

有关演示如何对内容类型使用 XML 的简单示例,请参阅演练:创建自定义字段、内容类型、列表定义和列表实例

与内容类型相关的领域

构造块:网站和网站集

构造块:列和字段类型

构建基块:工作流

构建基块:功能

有关内容类型的详细信息

内容类型简介

基内容类型层次结构

创建内容类型

更新子内容类型

如何:向列表添加内容类型