Назначение типа контента
-
16-10-2019 - |
Вопрос
В упрощенной форме у меня есть следующая ситуация.
Тип родительского контента
<ContentType ID="0x0100db5b9dac9c5f4d098820f922eebf3b39"
Name="Parent"
Group="Example Content Types"
Description="Parent Content Type"
Inherits="TRUE"
Version="0">
<FieldRefs>
<FieldRef ID="{3822302b-cff8-4f7c-bcc0-de1540cb7447}"
Name="FirstParentField" />
<FieldRef ID="{D1BBFFB1-A7DE-4DC8-B013-3D06E7D6FAAF}"
Name="SecondParentField" />
</FieldRefs>
</ContentType>
со следующими полями
<Field ID="{3822302b-cff8-4f7c-bcc0-de1540cb7447}"
Type="Text"
Name="FirstParentField"
DisplayName="First Parent Field"
Group="Example Columns"
Overwrite="TRUE" />
<Field ID="{D1BBFFB1-A7DE-4DC8-B013-3D06E7D6FAAF}"
Type="Text"
Name="SecondParentField"
DisplayName="Second Parent Field"
Group="Example Columns"
Overwrite="TRUE" />
и тип содержания ребенка, определяемый как
<ContentType ID="0x0100db5b9dac9c5f4d098820f922eebf3b39005fc63c83e67045908707c64645d4db55"
Name="Child"
Group="Example Content Types"
Description="Child Content Type"
Inherits="TRUE"
Version="0">
<FieldRefs>
<RemoveFieldRef ID="{D1BBFFB1-A7DE-4DC8-B013-3D06E7D6FAAF}"
Name="SecondParentField" />
<FieldRef ID="{5C3ADD2C-2196-4C79-8117-EEBCD453DD5F}"
Name="ChildField" />
</FieldRefs>
</ContentType>
со следующим полем
<Field ID="{5C3ADD2C-2196-4C79-8117-EEBCD453DD5F}"
Type="Text"
Name="ChildField"
DisplayName="Child Field"
Group="Example Columns"
Overwrite="TRUE" />
Идея состоит в том, чтобы скрыть одно из полей родителей в типе содержания ребенка, сохраняя при этом другое.
Как многие из вас, несомненно, знают, это не работает. Причина в том, что XML объявления могут только указать, как объект. Пытаясь удалить унаследованную ссылку на поле, я заявляю, что это похоже на родителя с небольшой модификацией - модификация не допускается.
Итак, в попытке обойти это ограничение, я добавил следующее
public override void FeatureActivated(SPFeatureReceiverProperties properties)
{
using (var web = ((SPSite)properties.Feature.Parent).RootWeb)
{
var child = web.AvailableContentTypes["Child"];
child.Update();
}
}
Подумав, что если я заставил обновление, будет применена модификация, объявленная в XML.
Это бросает спекцепцию, заявляя: «Коллекция не может быть изменена».
Не могли бы вы помочь мне понять, какая коллекция не может быть изменена и почему?
Решение
VailyableContentTypes-это коллекция только для чтения. Вместо этого используйте spweb.contenttypes.
Другие советы
Если вы используете решение для фермы, настройка наследства = "false" или удаление атрибута «Унаследованные» в типе содержания дочернего типа, должно решить вашу проблему. Это также устранит необходимость в приемнике функций.
Смотрите этот сообщение в блоге для получения дополнительной информации:
В родительском типе контента удалить henhits = "true"