Мне понадобилось более четверти десятка способов, чтобы наконец успешно и программно скопировать тип контента из одной сети в другую. Теперь, из методов, которые потерпели неудачу, только один из них воспроизвел бы вашу точную проблему и не полностью сгорел, так что я предполагаю, что это был метод, который вы пытались, и проанализируете, почему он терпит неудачу. Тогда я покажу вам метод, который работает правильно.
Нельзя программно добавлять поля к экземпляру типа контента, который ограничен только веб-уровнем. Попытка сделать это приводит к следующей явной ошибке:
Эта функция недоступна для коллекций полей, не связанных со списком.
Таким образом, если ваш метод заключается в том, чтобы в основном создать тип контента в новой сети, который наследуется от Item, а затем просто добавить пользовательский столбец, он не сможет добавить пользовательский столбец. Я предполагаю, что именно так вы пытались скопировать тип контента, так как любой другой подход, который я пробовал, либо терпел неудачу, либо работал и сохранял поле.
Чтобы заставить его работать, создайте новый тип контента, который относится к веб-уровню Web2, но наследует от исходного типа контента из Web1. Таким образом, используя тип контента ALICE, с которым я его тестировал, вы получите что-то вроде этого.
SPContentType ct2 = new SPContentType(Web1.ContentTypes["ALICE"], Web2.ContentTypes, "ALICE");
Web2.ContentTypes.Add(ct2);
Web2.Update();
Это создало тип контента ALICE на втором веб-сайте, который имеет пользовательский столбец, который имеет исходный тип контента ALICE. Теперь, поскольку исходный тип содержимого ALICE отсутствует в Web2, этот ALICE фактически не наследуется от этого ALICE. Вместо этого он наследует от Item, который вы можете подтвердить как в пользовательском интерфейсе, так и программно. Так что это становится успешной копией.
EDIT
Вот точный код, который я использовал, за исключением пары строк для вывода отладки и без указания моего реального адреса Web2. Он был запущен из рабочего процесса на Web1. Я предполагаю, что создание экземпляра типа контента по отдельности является основным отличием. Дайте мне знать, если это продолжает вызывать ту же ошибку.
SPWeb website = null; //Web1, which has ALICE already.
SPWeb web = null; //Web2, which does not yet have ALICE.
SPSite site = null;
try {
website = workflowProperties.Web;
site = new SPSite('webaddress of web2');
web = site.OpenWeb();
SPContentType ct = website.ContentTypes["ALICE"];
SPContentType act = new SPContentType(ct, web.ContentTypes, "ALICE");
act.Group = "Custom Content Types";
web.ContentTypes.Add(act);
web.Update();
}
finally { if (web != null) { web.Dispose(); } if (website != null) { website.Dispose(); } if (site != null) { site.Dispose(); } }