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

Чтобы устранить львиную долю этих ошибок, надо придерживаться следующих правил:

ContentType

Если вы хотите создать список, то не надо лезть в меню Add –> New Item –> List.  Для начала создайте поля для списка и тип контента. Даже если вы думаете, что тип контента будет ровно в одном списке, то все равно создавайте тип контента.

Тип контента вместе с полями деплойте в фиче уровня Site, желательно скрытой, чтобы никто не смог просто так отключить и поломать решение.

В этой же фиче необходимо выполнить все привязки Workflow, различных Policy и форм.

Важно чтобы после активации фичи тип контента был готов к использованию.

ContentTypeBinding

Элемент ContentTypeBinding позволяет привязать тип контента к экземпляру списка. При этом нет необходимости создавать List Definition. Достаточно создать список из одного из стандартных шаблонов, а потом сделать привязку.

<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
  <ListInstance Title="List1"
                OnQuickLaunch="TRUE"
                TemplateType="100"
                FeatureId="00bfea71-de22-43b2-a848-c05709900100"
                Url="Lists/List1"
                Description="My List Instance">
  </ListInstance>
  <ContentTypeBinding 
      ContentTypeId="0x0100EDFEDEA571A241FD80430F4D48A91346" 
      ListUrl="Lists/List1"/>
</Elements>

ContentTypeBinding еще очень хорош тем, что даже при наличии типа контента в списке, он добавит недостающие поля, Workflow, политики. Это очень удобно при апгрейде.

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

Необходимость писать код – один из недостатков привязки. Другой недостаток в том, что для нескольких списков код придется копипастить. Это все усложняет поддержку. Иногда проще сделать List Definition.

ContentTypeRef

Несколько раз подумайте перед тем как сделать List Definition (он же ListTemplate). Это очень опасный артефакт. Он крайне сложен в поддержке (сотни строк XML в самых простых случаях). Если у вас будет список, дефинишен которого вы удалили, то многие функции на сайте поломаются. При этом пользователи смогут самостоятельно создавать списки из дефинишенов через UI.

Если же вас необходим именно дефинишен, то сделайте его скрытым. Вы сильно снизите “область поражения”.

Но самая главная проблема в том, что List Definition, генерируемый Visual Studio, некорректен.

Поля определенные в List Definition не вызывают методов OnAdded и OnAddedToContentType. Типы контента (ContentType), определенные в дефинишене, не переносят все свойства, например обработчики событий.

Единственный способ правильно сделать List Definition – использовать только ContentTypeRef. Кроме того, используя ContentTypeRef, можно не указывать Fields, оставить пустой элемент. SharePoint автоматически добавит поля всех типов контента и вызовет их методы.

  <MetaData>
    <ContentTypes>
        <ContentTypeRef ID="0x0100EDFEDEA571A241FD80430F4D48A91346"/>
        <ContentTypeRef ID="0x0120" />
    </ContentTypes>
    <Fields></Fields>
    <Views> ... </Views>
    <Forms> ... </Forms>
  </MetaData>



UPD. Не убирайте тип контента папки (0x0120), он необходим для корректной работы.

Вместо заключения

Избежать многих ошибок при разработке под SharePoint поможет SPCAF (http://www.spcaf.com/). Для него можно создавать кастомные правила. Я сделал три правила, которые помогут правильно создавать списки.

Инструкция по сборке и установке http://docs.spcaf.com/v4/SPCAF_OVERVIEW_500_SDK.html

Теги : SharePoint 2013, spcaf, sp2013, codereview, SharePoint