SharePoint: идентификатор типа содержимого отличается от идентификатора типа содержимого, прикрепленного к экземпляру списка - PullRequest
2 голосов
/ 09 февраля 2009

У меня возник вопрос о типах контента и их идентификаторах, а также о том, как использовать их с объектной моделью.

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

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

 SPListItem listItem = list.Items.Add();
 SPContentType type = list.ContentTypes[new ContentTypeId("0x010044fb4458c2eb4800825910845a35554c")];
 listItem["ContentTypeId"] = type.Id;
 listItem["Title"] = "Titel";
 listItem.Update();

Когда я выполняю этот фрагмент кода, объект типа все еще равен нулю, также я уверен, что тип содержимого прикреплен к списку. Отладка кода и проверка типов содержимого списка показывает, что тип содержимого, прикрепленный к списку, не имеет идентификатора, определенного в определении типа содержимого (CAML). Идентификатор в экземпляре списка отличается, но начинается с идентификатора, который я определил в определении типа контента. 0x010044FB4458C2EB4800825910845A35554C 0077D683BDD9969F4E920A27C334463321

Так это поведение нормально? Я ожидал, что тип содержимого, прикрепленный к списку, будет иметь тот же идентификатор, что и в определении.

Моя главная цель - избегать использования имени типа контента для извлечения его из типов контента списка, но использовать уникальный идентификатор.

до свидания Flo

Ответы [ 3 ]

5 голосов
/ 09 февраля 2009

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

Взгляни на это ... http://soerennielsen.wordpress.com/2007/09/11/propagate-site-content-types-to-list-content-types/

Обновление. Что касается поиска экземпляра списка без использования имени, взгляните также на класс SPContentTypeUsage!

1 голос
/ 10 февраля 2009

ContentTypeID в списке - это ContentTypeID + идентификатор списка.

Следующий код должен помочь:

//i try and keep these in a string constants class to avoid 
//having to manage "magic strings" throughout my solution
SPContentTypeID ctid = new ContentTypeId("0x010044fb4458c2eb4800825910845a35554c");


//here's the magic
SPContentTypeID listCTID = list.ContentTypes.BestMatch(ctid);


//retrieve the ContentType with the appropriate ID
SPContentType type = list.ContentTypes[listCTID]; 


//do your thing    
SPListItem listItem = list.Items.Add(); 
listItem["ContentTypeId"] = type.Id; 
listItem["Title"] = "Titel"; 
listItem.Update();
1 голос
/ 09 февраля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...