Пользовательское поле не отображается в пользовательском типе контента - PullRequest
1 голос
/ 30 апреля 2010

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

Пользовательский тип контента наследуется от Item.

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

Есть идеи, почему это происходит?

Спасибо.

1 Ответ

2 голосов
/ 30 апреля 2010

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

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

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

Таким образом, если ваш метод заключается в том, чтобы в основном создать тип контента в новой сети, который наследуется от 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(); } }
...