内容类型 ID

上次修改时间: 2010年11月1日

适用范围: SharePoint Foundation 2010

本文内容
父内容类型 ID + 两个十六进制值
父内容类型 ID +"00"+ 十六进制 GUID
内容类型 ID 长度
在声明 XML 中使用内容类型 ID
在代码中使用内容类型 ID

在 SharePoint Online 中提供

内容类型 ID 唯一标识内容类型并设计为具有递归性。内容类型 ID 封装该内容类型的沿袭,或该内容类型继承自的父内容类型的行。每个内容类型 ID 均包含父内容类型的 ID,而后者又包含该内容类型的父级的 ID,依此类推,最终将回到并包括"系统"内容类型 ID。SharePoint Foundation 使用此信息来确定内容类型和向下推送操作之间的关系。

通过使用下面两个约定之一,可以构造一个有效的内容类型 ID:

  • 父内容类型 ID + 两个十六进制值(两个十六进制值不能为"00")

  • 父内容类型 ID +"00"+ 十六进制 GUID

备注

内容类型 ID 在网站集中必须是唯一的。

一般来说,第一种内容类型 ID 生成方法侧重于简洁性,它仅用两个十六进制数字来表示新的内容类型。第二种方法侧重于唯一性,它包含一个 GUID 来表示新的内容类型。每种方法均适用于特定的情况。

父内容类型 ID + 两个十六进制值

SharePoint Foundation 使用此约定为该平台附带的默认内容类型生成内容类型 ID。例如,基本内容类型"项目"的内容类型 ID 为 0x01。这表示"项目"内容类型是"系统"内容类型的直接子级。"文档"内容类型的内容类型 ID 为 0x0101,并且"文件夹"内容类型的内容类型 ID 为 0x0120。通过对这些内容类型 ID 进行分析,可以确定"文档"和"文件夹"都是项目的直接子级,反过来,"项目"又直接从"系统"继承,如下图所示。

文档内容类型 ID

通过使用此约定,不仅可以确定一种内容类型继承自哪些内容类型,并可以确定两种内容类型在哪一点上具有共同的上级。

下图演示的是前面已讨论的四种内容类型的关系。在每种内容类型中,内容类型 ID 的唯一部分用蓝色文本表示。

默认内容类型 ID 层次结构示例

父内容类型 ID +"00"+ 十六进制 GUID

在为以下内容类型创建内容类型 ID 时,SharePoint Foundation 将使用此内容类型 ID 生成约定:

  • 基于其他内容类型创建的网站内容类型

  • 在向列表添加网站内容类型时要复制到该列表的列表内容类型

例如,如果具有一种内容类型 ID 为"0x010100D5C2F139516B419D801AC6C18942554D"的内容类型,就会知道该内容类型属于下列内容类型之一:

  • 为"文档"内容类型的直接子级的网站内容类型

  • 在向列表添加"文档"网站内容类型时创建的列表内容类型

建议使用 GUID 方法来标识作为未创建的内容类型的直接子级的任何内容类型。如果父内容类型为下列内容类型之一,请使用 GUID 方法:

  • SharePoint Foundation 中包含的默认内容类型,例如"文档"。

  • 由第三方开发的内容类型。这样就可以确保该内容类型 ID 是唯一的并且将不会被父内容类型的开发人员复制。

但是,在使用 GUID 方法唯一标识内容类型之后,可以使用第一种方法来标识该内容类型的任何子级。在内容类型中使用的 GUID 可用作内容类型的命名空间。任何基于该内容类型的子级可以只由两个十六进制数字标识。由于内容类型 ID 的最大长度是有限的,因此该方法使允许的内容类型"后代"的数目最大。

内容类型 ID 长度

内容类型 ID 的最大长度为 512 个字节。由于每个字节可包含两个十六进制字符,因此每个内容类型 ID 的最大有效长度为 1024 个字符。

例如,假设基于默认的 SharePoint Foundation"文档"内容类型创建新的内容类型 myDocument。对于 myDocument 内容类型 ID,以"文档"内容类型 ID 0x0101 开始并追加 00 和 GUID。这将唯一标识 myDocument 内容类型,从而确保 SharePoint Foundation 稍后将不会添加具有同一内容类型 ID 的其他默认内容类型(如果只追加两个十六进制的数字,则可能发生此情况)。但是,若要为派生自 myDocument 的任何内容类型生成内容类型 ID,则只需向 myDocument 内容类型 ID 追加两个十六进制的数字。这将使内容类型 ID 的长度保持最小,从而使允许的内容类型"后代"的数目最大。

下图演示了此方案。每个内容类型 ID 的唯一部分用蓝色文本表示。

内容类型 ID 层次结构示例

在声明 XML 中使用内容类型 ID

可使用元素清单文件中的声明 XML 创建作为功能的一部分的新网站内容类型。SharePoint Foundation 提供了一个用于执行此操作的 XML 架构定义。有关详细信息,请参阅内容类型定义

内容类型定义中的顶层元素是 ContentType。此元素具有一个必需的 ID 属性,其值必须是一个内容类型 ID 格式的字符串。如果未能正确设置新内容类型的 ID 的格式,则在尝试激活在其中定义该内容类型的功能时会遇到错误。要避免此错误,请务必遵照本主题中介绍的规则来构造新内容类型的 ID。

要为派生自内置内容类型的内容类型创建 ID,请首先确定标识该内置内容类型的十六进制字符串,追加两个零,然后添加一个移除了所有标点的 GUID。例如,标识"项"内容类型的十六进制字符串为"0x01"。派生自项的内容类型的 ID 应如下所示:

0x0100A33D9AD9805788419BDAAC2CCB37509F

要为从内容类型继承的其他内容类型创建 ID,只需追加"01"、"02"等。

提示提示

基内容类型层次结构中列出了重要内置内容类型的 ID。此外,可快速引用任意网站可用的内容类型的 ID,方法是从服务器功能区中选择"网站设置",然后单击"库"部分中的"网站内容类型"。在内容类型链接上移动鼠标时,将在浏览器的状态栏中显示内容类型 ID。

下面的示例是创建三个内容类型的功能的元素清单。第一个新内容类型(财务文档)派生自"文档"内容类型。而财务文档是新"采购订单"和"发票"内容类型的父内容类型。

<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="https://schemas.microsoft.com/sharepoint/">

  <!-- Parent: Document (0x0101) -->
  <ContentType ID="0x0101000728167cd9c94899925ba69c4af6743e"
               Name="Financial Document"
               Group="Financial Content Types"
               Description="Base financial content type"
               Version="0">
    <FieldRefs>
      <FieldRef ID="{1511BF28-A787-4061-B2E1-71F64CC93FD5}" Name="OrderDate" DisplayName="Date" Required="FALSE"/>
      <FieldRef ID="{060E50AC-E9C1-4D3C-B1F9-DE0BCAC300F6}" Name="Amount" DisplayName="Amount" Required="FALSE"/>
    </FieldRefs>
  </ContentType>

  <!-- Parent: Financial Document (0x0101000728167cd9c94899925ba69c4af6743e) -->
  <ContentType ID="0x0101000728167cd9c94899925ba69c4af6743e01"
               Name="PurchaseOrder"
               Group="Financial Content Types"
               Description="Used for creating purchase orders"
               Inherits="TRUE"
               Version="0">
    <FieldRefs>
      <FieldRef ID="{fa564e0f-0c70-4ab9-b863-0177e6ddd247}" Name="Title" DisplayName="Item" Required="TRUE" Sealed="TRUE"/>
      <FieldRef ID="{943E7530-5E2B-4C02-8259-CCD93A9ECB18}" Name="CostCenter" DisplayName="Department" Required="TRUE"/>
    </FieldRefs>
    <DocumentTemplate TargetName="PurchaseOrder.docx"/>
  </ContentType>

  <!-- Parent: Financial Document (0x0101000728167cd9c94899925ba69c4af6743e) -->
  <ContentType ID="0x0101000728167cd9c94899925ba69c4af6743e02"
                Name="Invoice"
                Group="Financial Content Types"
                Description="Used for creating customer invoices"
                Inherits="TRUE"
                Version="0">
    <FieldRefs>
      <FieldRef ID="{fa564e0f-0c70-4ab9-b863-0177e6ddd247}" Name="Title" DisplayName="Service" Required="TRUE" Sealed="TRUE"/>
      <FieldRef ID="{86811853-7E52-4515-A88D-A8FA9D450905}" Name="Client" DisplayName="Client Name" Required="TRUE"/>
    </FieldRefs>
    <DocumentTemplate TargetName="Invoice.docx" />
  </ContentType>
</Elements>

在代码中使用内容类型 ID

服务器代码中 SPContentType 对象的 Id 属性或客户端代码中 ContentType 对象的同一属性返回的值不是十六进制字符串。它在服务器代码中是一个 SPContentTypeId 类型的对象,在客户端上是 ContentTypeId 类型的对象。

如果您知道某内容类型 ID 的十六进制字符串,则可通过将该字符串传递到相应类的构造函数来获取相应的对象。例如,以下服务器代码会构造一个表示"文档"内容类型的 ID 的 SPContentTypeId 对象。

using (SPSite site = new SPSite(https://localhost))
{
   using (SPWeb web = site.OpenWeb())
   {
      // Get the Document content type.
      SPContentTypeId documentCTypeId = new SPContentTypeId("0x0101");
      SPContentType documentCType = web.AvailableContentTypes[documentCTypeId];

      // Do something.
      ...
   }
}

您不需要知道包含在 SharePoint Foundation 中的任意内容类型的十六进制 ID。相反,您可以使用 SPBuiltInContentTypeId 类的字段。例如,当您的代码需要表示"文档"内容类型的 ID 时,它可使用 SPBuiltInContentTypeId.Document,而不是"0x0101"。以下代码演示此技术。

using (SPSite site = new SPSite(https://localhost))
{
   using (SPWeb web = site.OpenWeb())
   {
      // Get the Document content type.
      SPContentType documentCType = web.AvailableContentTypes[SPBuiltinContentTypeId.Document];

      // Do something.
      ...
   }
}

在代码中创建自己的内容类型时,不必为它创建 ID。相反,可让系统基于您的内容类型派生自的内容类型的 ID 生成一个 ID。

例如,以下控制台应用程序创建一个派生自"项"内容类型的新"客户"内容类型。该应用程序将使新内容类型成为网站内容类型,方法是将其添加到网站的内容类型集合中。然后它通过将该内容类型添加到列表的内容类型集合中,来将其应用于列表。最后,该应用程序打印所有三个内容类型(父内容类型、新网站内容类型和新列表内容类型)的 ID。

using System;
using Microsoft.SharePoint;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            using (SPSite site = new SPSite("https://localhost"))
            {
                using (SPWeb web = site.OpenWeb())
                {
                    // Get a reference to the Item content type.
                    SPContentType parentCType = web.AvailableContentTypes[SPBuiltInContentTypeId.Item];

                    // Create a Customer content type derived from the Item content type.
                    SPContentType childCType = new SPContentType(parentCType, web.ContentTypes, "Customer");

                    // Add the new content type to the site collection.
                    childCType = web.ContentTypes.Add(childCType);

                    // Add it to a list.
                    SPList list = web.Lists["Announcements"];
                    list.ContentTypesEnabled = true;
                    SPContentType listCType = list.ContentTypes.Add(childCType);

                    // Print the IDs.
                    Console.WriteLine("Parent content type ID: {0}", parentCType.Id.ToString());
                    Console.WriteLine("Site content type ID:   {0}", childCType.Id.ToString());
                    Console.WriteLine("List content type ID:   {0}", listCType.Id.ToString());
                }
            }

            Console.Write("\nPress ENTER to continue...");
            Console.ReadLine();
        }
    }
}

以下输出将打印到控制台:

Parent content type ID: 0x01
Site content type ID:   0x0100A33D9AD9805788419BDAAC2CCB37509F
List content type ID:   0x0100A33D9AD9805788419BDAAC2CCB37509F006454F8883E8BA648A632E5ACB47CAD9B

Press ENTER to continue...

请参阅

引用

SPContentTypeId

SPBuiltInContentTypeId

概念

基内容类型层次结构

网站和列表内容类型

创建内容类型