Рекомендуемый подход
Исходя из всех этих факторов, я бы предложил:
• Создать две функции: одну для исходной разметки и одну для внесения изменений,(Или вы можете поместить их в одну и ту же функцию; я просто хочу разграничить, где и что вы делаете.)
• Исходная функция должна содержать CAML для столбцов сайта и типов контента.Это гарантирует, что идентификаторы были назначены перед типом и остаются постоянными.
• Если вы хотите обновить столбец сайта, изменив в нем почти все, кроме его типа поля, сделайте это с помощью Feature Receiver.Сделав это, вы можете вызвать метод Update и передать логическое значение, указывающее, хотите ли вы обновить все существующие ресурсы на сайте, которые наследуют от этого, (что вы не могли сделать через CAML.)
• Вы также можете добавить существующий столбец сайта (который был предоставлен с помощью функции CAML) к существующему типу контента (который был предоставлен с помощью функции CAML).Это полезно, если столбец ранее не был частью этого типа контента и т. Д.
• В сценарии, подобном тому, который я только что упомянул в последнем пункте, необходимо деактивировать и активировать функцию CAML (чтобыпредоставление новых активов) до вызова вашего Feature Receiver.Что это будет значить для сайта?Поскольку все столбцы сайта и типы контента в списках на сайте используют те же идентификаторы, что и в корне семейства сайтов, удаление его родителя из семейства сайтов не изменит этого.Он может временно оставить его сиротским (т. Е. Не будет никакой связи между этим элементом и элементом в корне семейства сайтов, но он будет функционировать так же, как и всегда, поскольку это действительно полнофункциональная копия исходного элемента)пока вы не активируете функцию, которая возвращает элемент обратно в семейство сайтов.Как будто родители уезжают в отпуск, когда вы отключаете функцию, и возвращаетесь домой, когда вы снова активируете функцию.У вас есть выбор, когда вы будете поддерживать CAML и Feature Receiver, поскольку у вас есть два сценария: существующие семейства сайтов и новые.
• Вы можете создать политику, которая будет использоваться каждый раз при написании кода вВаш Feature Receiver для обновления столбца сайта или типа контента, вы также должны внести изменения в CAML.Это будет означать, что каждый раз, когда вы активируете функцию CAML в «новом» семействе сайтов, CAML будет обновленным и точным;не было бы необходимости запускать функцию «обновления».(В вашем Feature Receiver вы должны убедиться, что вы делаете дополнительную проверку, чтобы убедиться, что колонка сайта еще не принадлежит типу контента, прежде чем добавлять его и т. Д. В случае, если это изменение уже имеет место до выполнения кода.)Этот подход означает, что вам нужно выполнить только одну функцию при создании нового семейства сайтов, но это также означает, что вы сохраняете изменения в двух местах: в вашем Feature Receiver для внесения изменений в существующие сайты и в CAML для новых сайтов.Это более чистый подход, но он также содержит элемент избыточности, который всегда оставляет место для человеческой ошибки.
• Другой подход заключается в том, чтобы просто предполагать, что каждый раз, когда активируется базовая функция CAML, вы всегда будете работатьвыполнить Feature Receiver.Этот подход говорит, что единственный раз, когда вы меняете CAML, это добавление нового столбца сайта или нового типа контента;в противном случае все изменения происходят в Feature Receiver.Этот подход уменьшает избыточность, но также означает, что ваш код Feature Receiver может стать достаточно большим со всеми вашими изменениями с течением времени, и это может сделать ваш CAML очень «устаревшим» со временем.
Src: http://blog.beckybertram.com/Lists/Posts/Post.aspx?List=eb3e1762%2Dbab0%2D4e96%2D8bc5%2Dd67d6e6bfd44&ID=18