Пользовательское поле, не показывающее в Пользовательском Типе контента

Я создал пользовательский столбец в пользовательском типе контента в сети Sharepoint вручную (например,/MySite/MyWeb). Я теперь хочу программно скопировать этот тип контента через в другую сеть (например,/MySite/MyWeb2). Однако после цикличного выполнения через пользовательский тип контента в коде, я мог только найти 2 поля: Тип контента и Заголовок (ожидаемый: Заголовок и пользовательский столбец). Пользовательский столбец отсутствовал. Я очень уверен, что тип контента и поле добавляются на веб-уровне.

Пользовательский тип контента наследован от Объекта.

Когда я циклично выполняюсь через поля сети, я вижу пользовательский столбец, и это было скопировано в новую сеть. Только в типе контента пользовательский столбец не обнаруживается.

Какие-либо идеи, почему это происходит?

Спасибо.

1
задан BeraCim 30 April 2010 в 02:15
поделиться

1 ответ

Мне потребовалось более четверти десятка методов, чтобы, наконец, успешно и программно скопировать тип содержимого с одного сайта на другой. Из всех методов, которые не сработали, только один воспроизвел вашу проблему и не сработал полностью, поэтому я предположу, что это тот метод, который вы пробовали, и проанализирую, почему он не сработал. Затем я покажу вам метод, который работает правильно.

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

Эта функциональность недоступна для коллекций полей, не связанных со списком.

Таким образом, если бы ваш метод заключался в создании типа содержимого в новом веб, который наследуется от 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(); } }
2
ответ дан 3 September 2019 в 00:56
поделиться