Поделиться через


Создание типов контента

Дата последнего изменения: 1 ноября 2010 г.

Применимо к: SharePoint Foundation 2010

В этой статье
Наследование типа контента
Проектирование типов контента
Создание типа контента с помощью декларативной XML-разметки
Создание типа контента с помощью кода

Доступно на сайте SharePoint Online

Для создания типа контента разработчик использует декларативную XML-разметку или, возможно, серверный код. Почти всегда это делается при создании компонента, который будет устанавливать кто-то другой, а активировать кто-то третий. Вот почему действия для типа контента фактически являются не его созданием, а его определением.

Наконец, компонент установлен, и кто-то его активировал. Microsoft SharePoint Foundation выполняет созданный код или считывает декларативную XML-разметку и делает доступным тип контента. Пользователь с правами администратора на управление списками применяет новый тип контента к списку или библиотеке документов, и этот тип можно использовать. Любой пользователь, которому разрешено добавлять элементы в список, может использовать созданный тип контента для создания контента. Пользователи с правами администратора могут изменить тип контента в соответствии со своими потребностями, добавить или удалить столбцы, изменить другие атрибуты. Разработчик уже не сможет повлиять на эти изменения.

Таким образом, ключевым моментом является то, что "создание" типа контента фактически означает создание его определения. Хорошее определение типа контента предопределяет конечное использование типа контента.

Наследование типа контента

Тип контента никогда не создается с нуля. Напротив, при создании любого типа контента в качестве основы всегда выбирается существующий тип контента. Этот же принцип действует в Microsoft SharePoint Foundation в отношении встроенных типов контента. Сведения об иерархии типов контента, поставляемых с SharePoint Foundation, см. в статье Базовая иерархия типов контента.

Веб-сайт, на котором создается новый тип контента, должен находиться в той же области, что и тип контента, производным от которого является новый тип, и это следует учитывать при написании определения типа контента. Дополнительные сведения см. в статье Область определения типа контента.

SharePoint Foundation поддерживает ограниченную разновидность наследования типов контента. При активации компонента, в котором определен новый тип контента, столбцы и другие метаданные, заданные для родительского типа, передаются дочернему типу. Это единственная составляющая наследования, которая выполняется автоматически.

ПримечаниеПримечание

В предыдущих версиях SharePoint Foundation столбцы и метаданные, добавленные в тип контента после его подготовки, не наследовались дочерними типами контента. В SharePoint Foundation 2010 это поведение изменилось. Теперь можно включать столбцы и метаданные, добавленные в родительский тип. Дополнительные сведения см. в описании атрибута Inherits для элемента ContentType.

После того как тип контента становится доступным и начинает использоваться, определение родительского типа контента может быть изменено, но изменения не будут автоматически распространяться на производные типы контента. Этот аспект наследования необходимо инициировать вручную, либо с помощью пользовательского интерфейса, либо в пользовательском коде. Дополнительные сведения см. в статье Обновление дочерних типов контента.

Наследование типов контента позволяет работать с ними фактически так же, как и с производными классами. Например, подобно переопределению свойств базового класса можно изменить атрибуты, которые создаваемый тип контента получает от родительского типа. Можно добавить, изменить или удалить столбцы, определить другие формы создания, редактирования или отображения, определить другой шаблон документов и т. д. Это означает, что можно создавать базовые типы контента точно так же, как создаются базовые классы при разработке платформы приложений. Например, можно определить тип контента с именем "Financial Document" и характеристиками, общими для всех финансовых документов в организации. Затем можно использовать тип "Financial Document" в качестве основы для новых типов контента, таких как "Invoice" и "Purchase Order". Новые типы контента наследуют столбцы и другие метаданные от типа "Financial Document", поэтому общие элементы достаточно определить только один раз, в родительском типе контента.

Представление о создании собственной иерархии типов контента можно получить, изучив, как в SharePoint Foundation используются унаследованные атрибуты базовых типов контента и как они изменяются. В качестве отправной точки можно воспользоваться коллекцией типов контента в пользовательском интерфейсе. В меню Действия сайта выберите пункт Параметры сайта. На странице Параметры сайта в разделе Коллекции выберите Типы контента сайта. На странице Типы контента сайта щелкните ссылку для интересующего типа контента.

Еще одним полезным ресурсом для изучения является файл ctypewss.xml в папке "%ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\FEATURES\ctype". Этот файл содержит определения для многих встроенных типов контента. Разобраться в определениях поможет раздел Определения типов контента.

Проектирование типов контента

Полное руководство по планированию типов контента см. в статье, посвященной планированию типов контента и рабочих процессов. Ниже приведены некоторые общие соображения.

  • Область применения. В каком месте иерархии веб-сайтов нужно сделать доступным тип контента?

    Если тип контента должен быть доступен во всем семействе веб-сайтов, следует развернуть его в компоненте с областью применения, охватывающей семейство веб-сайтов, и написать код в методе FeatureActivated класса приемника компонентов, который добавляет тип контента в коллекцию типов контента корневого веб-сайта.

  • Родительский тип. От какого типа контента, существующего в нужной области применения, будет наследоваться создаваемый тип контента?

    Тип контента не будет правильно активирован, если родительский тип контента недоступен на сайте, где создается тип контента.

  • Столбцы. Какие из существующих столбцов веб-сайта доступны для использования?

    Необходимо добавить столбцы, которые не наследуются от родительского типа контента. Несуществующие столбцы необходимо создать.

  • Другие ресурсы. Потребуются ли для типа контента языковые ресурсы? Шаблоны документов? Формы?

    Если типу контента требуются любые из этих ресурсов, необходимо знать, как они будут подготавливаться, и как тип контента получит к ним доступ.

Создание типа контента с помощью декларативной XML-разметки

Один из способов создания типа контента — использование декларативного XML-кода для определения типа контента в файле манифеста элементов для компонента. При активации компонента создается тип контента. Дополнительные сведения см. в разделах Определения типов контента и Использование компонентов.

В одном файле манифеста элементов можно определить несколько типов контента. Включите элемент ContentType для каждого определяемого типа контента. Атрибут ID является обязательным, а задаваемое значение должно иметь точный формат. Правильный идентификатор типа контента определяет не только новый тип контента, но и его родительский тип контента. Дополнительные сведения см. в статье Идентификаторы типов контента.

Идентификатор для типа контента, производного от встроенного типа контента, начинается с шестнадцатеричной строки, которая соответствует встроенному типу, после нее идут два нуля, а затем идентификатор GUID без знаков препинания. Например, шестнадцатеричной строкой, определяющей тип контента "Элемент", является "0x01". Идентификатор типа контента, производного от "Элемент", будет выглядеть примерно следующим образом:

0x0100A33D9AD9805788419BDAAC2CCB37509F

Чтобы создать идентификаторы для дополнительных типов контента, наследуемых от создаваемого типа контента, просто добавьте "01", "02" и т. д.

Другим обязательным атрибутом элемента ContentType является атрибут Name, определяющий отображаемое имя. Это значение может быть ссылкой на ресурс в формате $Resources:String. Дополнительные сведения см. в статье, посвященной локализации решений SharePoint. Имя не может быть длиннее 128 знаков и не может содержать знаки \ / : * ? " # % < > { } | ~ &, две точки подряд (..) и специальные знаки, например символ табуляции.

При включении столбцов в тип контента не нужно создавать эти столбцы в определении типа контента. Вместо этого можно сослаться на столбцы, созданные в другом месте. Чтобы включить ссылку на столбец, добавьте элемент FieldRef в качестве дочернего для элемента ContentType. Столбец, на который указывает ссылка, может быть столбцом, уже существующим как столбец веб-сайта, или новым столбцом, созданным тем же компонентом, который создает тип контента. Сведения о создании столбцов сайта см. в разделе Определения полей.

Элемент FieldRef также можно использовать для ссылки на столбец, наследуемый создаваемым типом контента от родительского типа контента. В этом случае причиной использования ссылки на столбец будет не необходимость добавления столбца, а изменение некоторых из его характеристик при его использовании в типе контента.

Атрибут ID элемента FieldRef определяет столбец, являющийся объектом ссылки. Это значение должно быть строковым представлением GUID, включая фигурные скобки. В значении учитывается регистр знаков.

СоветСовет

Идентификаторы встроенных полей можно найти в файле fieldswss.xml, расположенном в следующей папке: %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\FEATURES\fields.

Если для создаваемого типа контента используется шаблон документа для нового контента, его можно определить в элементе DocumentTemplate внутри элемента ContentType. Соответствующий файл необходимо подготовить отдельно. Одним из способов выполнить это является добавление элемента Module в манифест и включение файла с компонентом. Дополнительные сведения см. в разделе Подготовка файла.

Определение типа контента также может содержать определения настраиваемых форм в элементе XMLDocuments. Дополнительные сведения см. в статье Особые сведения в типах контента.

Пример

В следующем примере показан манифест элементов для компонента, создающего четыре столбца сайта и три типа контента сайта. Первый тип контента, "Financial Document", является потомком встроенного типа контента Document. Оба оставшихся два новых типа контента, Invoice и Purchase Order, являются производными от типа Financial Document.

Определение типа "Financial Document" ссылается на два новых столбца сайта, "DateOpened" (Дата открытия) и "Amount" (Количество). Элемент FieldRef, ссылающийся на столбец "DateOpened", задает значение атрибута DisplayName таким образом, что имя столбца будет отображаться как "Date" (Дата), а не "DateOpened", как задано в определении столбца сайта.

Тип контента Invoice является первым из двух новых типов контента, производным от типа Financial Document. Определение типа контента ссылается на третий новый столбец сайта, Client, и задает для атрибута Required значение TRUE, чтобы при создании нового элемента запись в этом поле была бы обязательной. Тип Invoice содержит элемент FieldRef для столбца Title, несмотря на то, что он является наследуемым, чтобы изменить значение атрибута DisplayName с Title на Service.

Вторым типом контента, производным от типа "Financial Document", является "Purchase Order". Определение для типа контента ссылается на четвертый новый столбец сайта, "Cost Center" (Центр расходов), и задает атрибут DisplayName, чтобы имя столбца отображалось как "Department" (Отдел), а не как "Cost Center", как указано в столбце сайта.

Тип "Purchase Order" наследует ссылки на столбцы от родительского типа ("Financial Document"), поэтому нет необходимости ссылаться на них снова. Тип контента также наследует ссылку на столбец "Title" типа "Financial Document", который, в свою очередь, наследует этот столбец от своего родительского типа ("Document"). Тип "Purchase Order" включает элемент FieldRef для столбца "Title" с целью переопределения унаследованного атрибута DisplayName.

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

  <!-- Document Templates -->
  
  <Module Name="InvoiceDocumentTemplate"
          Path="FinancialDocuments"
          Url="_cts/Invoice" RootWebOnly="TRUE">
    <File Url="Invoice.docx" Type="Ghostable" />
  </Module>
  
  <Module Name="PurchaseOrderDocumentTemplate"
          Path="FinancialDocuments"
          Url="_cts/PurchaseOrder" RootWebOnly="TRUE">
    <File Url="PurchaseOrder.docx" Type="Ghostable" />
  </Module>


  <!-- Site Columns -->
 
  <Field ID="{060E50AC-E9C1-4D3C-B1F9-DE0BCAC300F6}"
         Name="Amount"
         DisplayName="Amount"
         Type="Currency"
         Decimals="2"
         Min="0"
         Required="FALSE"
         Group="Financial Columns" />

   <Field ID="{86811853-7E52-4515-A88D-A8FA9D450905}"
         Name="Client"
         DisplayName="Client Name"
         Type="Text"
         Required="FALSE"
         Group="Financial Columns"/>

    <Field ID="{1511BF28-A787-4061-B2E1-71F64CC93FD5}"
         Name="DateOpened"
         DisplayName="Date Opened"
         Type="DateTime"
         Format="DateOnly"
         Required="FALSE"
         Group="Financial Columns">
    <Default>[today]</Default>
  </Field>
  
 <Field ID="{943E7530-5E2B-4C02-8259-CCD93A9ECB18}"
         Name="CostCenter"
         DisplayName="Department"
         Type="Choice"
         Required="FALSE"
         Group="Financial Columns">
    <CHOICES>
      <CHOICE>Administration</CHOICE>
      <CHOICE>Information</CHOICE>
      <CHOICE>Facilities</CHOICE>
      <CHOICE>Operations</CHOICE>
      <CHOICE>Sales</CHOICE>
      <CHOICE>Marketing</CHOICE>
    </CHOICES>
  </Field>

  <!-- Site Content Types -->
  
  <!-- Parent ContentType: 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="DateOpened" DisplayName="Date" Required="TRUE"/>
      <FieldRef ID="{060E50AC-E9C1-4D3C-B1F9-DE0BCAC300F6}" Name="Amount" DisplayName="Amount" Required="FALSE"/>
    </FieldRefs>
  </ContentType>

  <!-- Parent ContentType: Financial Document -->
  <ContentType ID="0x0101000728167cd9c94899925ba69c4af6743e01"
                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>
  
  <!-- Parent ContentType: Financial Document -->
  <ContentType ID="0x0101000728167cd9c94899925ba69c4af6743e02"
               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>

</Elements>

Создание типа контента с помощью кода

Альтернативой применению декларативной XML-разметки для создания типа контента является объектная модель SharePoint Foundation. Обычно декларативную XML-разметку написать легче. Но декларативная XML-разметка обычно предлагает меньше гибкости, чем объектная модель, которая предлагает доступ к возможностям всей платформы Microsoft .NET Framework и допускает отладку во время выполнения. Оба подхода поддерживаются шаблонами, поставляемыми с разработки SharePoint в Microsoft Visual Studio 2010.

Поместите код, определяющий создаваемый тип контента, в метод FeatureActivated подкласса класса SPFeatureReceiver.

Тип контента создается путем вызова конструктора для класса SPContentType. Перед вызовом конструктора необходимо получить три элемента для передачи в качестве аргументов:

  • Объект SPContentType, представляющий родительский тип контента.

    Этот объект можно извлечь из коллекции, возвращаемой свойством AvailableContentTypes объекта SPWeb, представляющего веб-сайт, на котором создается тип контента.

  • Объект SPContentTypeCollection, представляющий коллекцию для веб-сайта, на котором создается тип контента.

    Этот объект можно получить, обратившись к свойству ContentTypes объекта SPWeb, представляющего веб-сайт, на котором создается тип контента.

  • Строка, содержащая имя, которое нужно назначить типу контента.

    Предоставленное имя используется в качестве отображаемого имени типа контента. Некоторые знаки использовать в именах типов контента запрещено. Предполагаемое имя можно проверить, вызвав статический метод ValidateName(String). Этот метод проверяет наличие запрещенных знаков, но не наличие дубликатов имен.

После вызова конструктора для создания объекта SPContentType необходимо добавить этот объект в коллекцию типов контента веб-сайта с помощью отдельного вызова метода Add(SPContentType) объекта SPContentTypeCollection, представляющего коллекцию веб-сайта. На этом инициализация типа контента завершается.

Предупреждающая заметкаВнимание!

Если в коллекции уже существует тип контента с таким же именем, метод Add(SPContentType) создает исключение SPException.

Если нужно задать свойства типа контента, следует сохранить объект SPContentType, возвращенный методом Add.

Можно добавить столбцы в тип контента, ссылаясь на каждый столбец в объекте SPFieldLink. Затем нужно вызвать метод Add(SPFieldLink) объекта SPFieldLinkCollection, возвращенного свойством FieldLinks типа контента.

После завершения настройки типа контента вызовите метод Update(), чтобы записать изменения в базу данных.

Пример

В следующем примере создаются те же самые столбцы веб-сайта и типы контента, что и в предыдущем примере. Единственным различием является использование кода в методе FeatureActivated приемника компонента вместо декларативной XML-разметки.

Параметром properties метода FeatureActivated является объект SPFeatureReceiverProperties. Свойство Feature этого объекта возвращает объект SPFeature, свойство Parent которого содержит упакованный объект SPSite или упакованный объект SPWeb. Эти объекты удалять не следует. Однако следует удалить все новые объекты SPWeb или SPSite, создаваемые в коде. Дополнительные сведения см. в статье Удаление объектов.

public override void FeatureActivated(SPFeatureReceiverProperties properties)
{
    SPWeb web = null;
    if (properties.Feature.Parent is SPSite)
    {
        SPSite sites = (SPSite)properties.Feature.Parent;
        web = sites.RootWeb;
    }
    else
    {
        web = (SPWeb)properties.Feature.Parent;
    }
    if (web == null)
        return;

    /* CREATE SITE COLUMNS */

    string columnGroup = "Financial Columns";

    // Amount
    string amountFieldName = web.Fields.Add("Amount", SPFieldType.Currency, false);
    SPFieldCurrency amountField = (SPFieldCurrency)web.Fields.GetFieldByInternalName(amountFieldName);
    amountField.Group = columnGroup;
    amountField.DisplayFormat = SPNumberFormatTypes.TwoDecimals;
    amountField.MinimumValue = 0;
    amountField.Update();

    // Client Name
    string clientFieldName = web.Fields.Add("Client Name", SPFieldType.Text, false);
    SPFieldText clientField = (SPFieldText)web.Fields.GetFieldByInternalName(clientFieldName);
    clientField.Group = columnGroup;
    clientField.Update();

    // Date Opened
    string dateOpenedFieldName = web.Fields.Add("Date Opened", SPFieldType.DateTime, false);
    SPFieldDateTime dateOpenedField = (SPFieldDateTime)web.Fields.GetFieldByInternalName(dateOpenedFieldName);
    dateOpenedField.Group = columnGroup;
    dateOpenedField.DisplayFormat = SPDateTimeFieldFormatType.DateOnly;
    dateOpenedField.DefaultValue = "[today]";
    dateOpenedField.Update();

    // Cost Center Name
    string costCenterFieldName = web.Fields.Add("Cost Center", SPFieldType.Choice, false);
    SPFieldChoice costCenterField = (SPFieldChoice)web.Fields.GetFieldByInternalName(costCenterFieldName);
    costCenterField.Choices.Add("Administration");
    costCenterField.Choices.Add("Information Services");
    costCenterField.Choices.Add("Facilities");
    costCenterField.Choices.Add("Operations");
    costCenterField.Choices.Add("Sales");
    costCenterField.Choices.Add("Marketing");
    costCenterField.Group = columnGroup;
    costCenterField.Update();

    /* CREATE SITE CONTENT TYPES */

    string contentTypeGroup = "Financial Content Types";

    // Get a content type to be the parent of a new Financial Document content type.
    SPContentType documentCType = web.AvailableContentTypes[SPBuiltInContentTypeId.Document];

    // Create the Financial Document content type.
    SPContentType financialDocumentCType = new SPContentType(documentCType, web.ContentTypes, "Financial Document");

    // Note: A content type is not initialized until after it is added.
    financialDocumentCType = web.ContentTypes.Add(financialDocumentCType);
    financialDocumentCType.Group = contentTypeGroup;

    // Add the Date Opened column. Child content types inherit the column.
    SPFieldLink dateOpenedFieldRef = new SPFieldLink(dateOpenedField);
    dateOpenedFieldRef.Required = true;
    financialDocumentCType.FieldLinks.Add(dateOpenedFieldRef);

    // Add the Amount column. Child content types inherit the column.
    SPFieldLink amountFieldRef = new SPFieldLink(amountField);
    financialDocumentCType.FieldLinks.Add(amountFieldRef);

    // Commit changes.
    financialDocumentCType.Update();

    // Create the Invoice content type.
    SPContentType invoiceCType = new SPContentType(financialDocumentCType, web.ContentTypes, "Invoice");
    invoiceCType = web.ContentTypes.Add(invoiceCType);
    invoiceCType.Group = contentTypeGroup;

    // Modify the Title column inherited from the parent.
    SPFieldLink serviceFieldRef = invoiceCType.FieldLinks[SPBuiltInFieldId.Title];
    serviceFieldRef.DisplayName = "Service";
    serviceFieldRef.Required = true;

    // Add the Client column.
    SPFieldLink clientFieldRef = new SPFieldLink(clientField);
    clientFieldRef.Required = true;
    invoiceCType.FieldLinks.Add(clientFieldRef);

    // Specify a document template.
    invoiceCType.DocumentTemplate = "Invoice.docx";

    // Commit changes.
    invoiceCType.Update();

    // Create the Purchase Order content type.
    SPContentType purchaseOrderCType = new SPContentType(financialDocumentCType, web.ContentTypes, "Purchase Order");
    purchaseOrderCType = web.ContentTypes.Add(purchaseOrderCType);
    purchaseOrderCType.Group = contentTypeGroup;

    // Modify the Title column inherited from the parent.
    SPFieldLink itemFieldRef = purchaseOrderCType.FieldLinks[SPBuiltInFieldId.Title];
    itemFieldRef.DisplayName = "Item";
    itemFieldRef.Required = true;

    // Add the Department column.
    SPFieldLink departmentFieldRef = new SPFieldLink(costCenterField);
    departmentFieldRef.DisplayName = "Department";
    departmentFieldRef.Required = true;
    purchaseOrderCType.FieldLinks.Add(departmentFieldRef);

    // Specify a document template.
    purchaseOrderCType.DocumentTemplate = "PurchaseOrder.docx";

    // Commit changes.
    purchaseOrderCType.Update();

}
Public Overrides Sub FeatureActivated(ByVal properties As Microsoft.SharePoint.SPFeatureReceiverProperties)
    Dim web As SPWeb = Nothing
    If TypeOf properties.Feature.Parent Is SPSite Then
        Dim sites As SPSite = DirectCast(properties.Feature.Parent, SPSite)
        web = sites.RootWeb
    Else
        web = DirectCast(properties.Feature.Parent, SPWeb)
    End If
    If web Is Nothing Then
        Return
    End If

    ' CREATE SITE COLUMNS 

    Dim columnGroup As String = "Financial Columns"

    ' Amount
    Dim amountFieldName As String = web.Fields.Add("Amount", SPFieldType.Currency, False)
    Dim amountField As SPFieldCurrency = DirectCast(web.Fields.GetFieldByInternalName(amountFieldName), SPFieldCurrency)
    amountField.Group = columnGroup
    amountField.DisplayFormat = SPNumberFormatTypes.TwoDecimals
    amountField.MinimumValue = 0
    amountField.Update()

    ' Client Name
    Dim clientFieldName As String = web.Fields.Add("Client Name", SPFieldType.Text, False)
    Dim clientField As SPFieldText = DirectCast(web.Fields.GetFieldByInternalName(clientFieldName), SPFieldText)
    clientField.Group = columnGroup
    clientField.Update()

    ' Date Opened
    Dim dateOpenedFieldName As String = web.Fields.Add("Date Opened", SPFieldType.DateTime, False)
    Dim dateOpenedField As SPFieldDateTime = DirectCast(web.Fields.GetFieldByInternalName(dateOpenedFieldName), SPFieldDateTime)
    dateOpenedField.Group = columnGroup
    dateOpenedField.DisplayFormat = SPDateTimeFieldFormatType.DateOnly
    dateOpenedField.DefaultValue = "[today]"
    dateOpenedField.Update()

    ' Cost Center Name
    Dim costCenterFieldName As String = web.Fields.Add("Cost Center", SPFieldType.Choice, False)
    Dim costCenterField As SPFieldChoice = DirectCast(web.Fields.GetFieldByInternalName(costCenterFieldName), SPFieldChoice)
    costCenterField.Choices.Add("Administration")
    costCenterField.Choices.Add("Information Services")
    costCenterField.Choices.Add("Facilities")
    costCenterField.Choices.Add("Operations")
    costCenterField.Choices.Add("Sales")
    costCenterField.Choices.Add("Marketing")
    costCenterField.Group = columnGroup
    costCenterField.Update()

    ' CREATE SITE CONTENT TYPES 

    Dim contentTypeGroup As String = "Financial Content Types"

    ' Get a content type to be the parent of a new Financial Document content type.
    Dim documentCType As SPContentType = web.AvailableContentTypes(SPBuiltInContentTypeId.Document)

    ' Create the Financial Document content type.
    Dim financialDocumentCType As New SPContentType(documentCType, web.ContentTypes, "Financial Document")

    ' Note: A content type is not initialized until after it is added.
    financialDocumentCType = web.ContentTypes.Add(financialDocumentCType)
    financialDocumentCType.Group = contentTypeGroup

    ' Add the Date Opened column. Child content types inherit the column.
    Dim dateOpenedFieldRef As New SPFieldLink(dateOpenedField)
    dateOpenedFieldRef.Required = True
    financialDocumentCType.FieldLinks.Add(dateOpenedFieldRef)

    ' Add the Amount column. Child content types inherit the column.
    Dim amountFieldRef As New SPFieldLink(amountField)
    financialDocumentCType.FieldLinks.Add(amountFieldRef)

    ' Commit changes.
    financialDocumentCType.Update()

    ' Create the Invoice content type.
    Dim invoiceCType As New SPContentType(financialDocumentCType, web.ContentTypes, "Invoice")
    invoiceCType = web.ContentTypes.Add(invoiceCType)
    invoiceCType.Group = contentTypeGroup

    ' Modify the Title column inherited from the parent.
    Dim serviceFieldRef As SPFieldLink = invoiceCType.FieldLinks(SPBuiltInFieldId.Title)
    serviceFieldRef.DisplayName = "Service"
    serviceFieldRef.Required = True

    ' Add the Client column.
    Dim clientFieldRef As New SPFieldLink(clientField)
    clientFieldRef.Required = True
    invoiceCType.FieldLinks.Add(clientFieldRef)

    ' Specify a document template.
    invoiceCType.DocumentTemplate = "Invoice.docx"

    ' Commit changes.
    invoiceCType.Update()

    ' Create the Purchase Order content type.
    Dim purchaseOrderCType As New SPContentType(financialDocumentCType, web.ContentTypes, "Purchase Order")
    purchaseOrderCType = web.ContentTypes.Add(purchaseOrderCType)
    purchaseOrderCType.Group = contentTypeGroup

    ' Modify the Title column inherited from the parent.
    Dim itemFieldRef As SPFieldLink = purchaseOrderCType.FieldLinks(SPBuiltInFieldId.Title)
    itemFieldRef.DisplayName = "Item"
    itemFieldRef.Required = True

    ' Add the Department column.
    Dim departmentFieldRef As New SPFieldLink(costCenterField)
    departmentFieldRef.DisplayName = "Department"
    departmentFieldRef.Required = True
    purchaseOrderCType.FieldLinks.Add(departmentFieldRef)

    ' Specify a document template.
    purchaseOrderCType.DocumentTemplate = "PurchaseOrder.docx"

    ' Commit changes.
    purchaseOrderCType.Update()

End Sub

См. также

Задачи

Практическое руководство: ссылка на столбец в типе контента

Практическое руководство. Добавление типа контента на сайт

Добавление типа контента в список

Концепции

Типы контента сайта и списка

Область определения типа контента

Определения типов контента

Другие ресурсы

Планирование типов контента и рабочих процессов

Создание пользовательских типов контента в SharePoint 2010 (Возможно, на английском языке)

Пошаговое руководство. Создание настраиваемого поля, типа контента, определения списка и экземпляра списка

Практическое руководство. Программное создание типов контента (Возможно, на английском языке)