Вопрос

В упрощенной форме у меня есть следующая ситуация.

Тип родительского контента

<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" или удаление атрибута «Унаследованные» в типе содержания дочернего типа, должно решить вашу проблему. Это также устранит необходимость в приемнике функций.

Смотрите этот сообщение в блоге для получения дополнительной информации:

http://msmvps.com/blogs/windsor/archive/2011/05/02/custom-content-types-and-inherits-in-sharepoint-2010.aspx

В родительском типе контента удалить henhits = "true"

Лицензировано под: CC-BY-SA с атрибуция
Не связан с sharepoint.stackexchange
scroll top