SPFields em uma lista com tipos de conteúdo habilitados não estão sendo atualizados conforme esperado

sharepoint.stackexchange https://sharepoint.stackexchange.com//questions/36468

  •  09-12-2019
  •  | 
  •  

Pergunta

Há uma grande peça do quebra-cabeça que estou perdendo aqui.

Eu tenho uma lista com tipos de conteúdo habilitados.Estou tentando programaticamente adicionar uma opção a alguns campos de escolha no método featureupgrading.Os campos na coleção de campos estão sendo atualizados, mas os campos nos tipos de conteúdo da lista não.

Código abaixo:

EventReciever.cs

public override void FeatureUpgrading(SPFeatureReceiverProperties properties, string upgradeActionName, System.Collections.Generic.IDictionary<string, string> parameters)
{
    SPWeb web = (SPWeb)properties.Feature.Parent;

    switch ( upgradeActionName ) {
        case "AddChoice":
            AddChoice(web.Fields[new Guid(parameters["FieldID"])] as SPFieldMultiChoice, parameters["Choice"]);
            break;
    }
}

protected static void AddChoice(SPFieldMultiChoice field, string choice) {
    if ( field == null ) {
        throw new ArgumentNullException("field");
    }

    field.Choices.Add(choice);
    field.Update(true);
}

Modelo.xml

<?xml version="1.0" encoding="utf-8" ?>
<Feature xmlns="http://schemas.microsoft.com/sharepoint/">
    <UpgradeActions>
        <VersionRange BeginVersion="0.0.0.0" EndVersion="1.0.1.0">
            <CustomUpgradeAction Name="AddChoice">
                <Parameters>
                    <Parameter Name="FieldID">{82E08EC3-0C5C-4565-B0D1-740BDBE4FA93}</Parameter>
                    <Parameter Name="Choice">METT</Parameter>
                </Parameters>
            </CustomUpgradeAction>
            <CustomUpgradeAction Name="AddChoice">
                <Parameters>
                    <Parameter Name="FieldID">{1C2947AF-86EB-4DD0-95AF-D27FBA8EE3BC}</Parameter>
                    <Parameter Name="Choice">METT</Parameter>
                </Parameters>
            </CustomUpgradeAction>
            <CustomUpgradeAction Name="AddChoice">
                <Parameters>
                    <Parameter Name="FieldID">{EBA64EAA-000E-46EE-B1DE-C9761899A31B}</Parameter>
                    <Parameter Name="Choice">METT</Parameter>
                </Parameters>
            </CustomUpgradeAction>
        </VersionRange>
    </UpgradeActions>
</Feature>

Obrigado pelo seu tempo.

Atualizar:

De acordo com o comentário de Derek Gusoff abaixo, alterei meu método AddChoice para o código a seguir.Ainda não funciona.Ainda estou muito perdido sobre como você deve fazer isso.

protected static void AddChoice(SPWeb web, SPFieldMultiChoice field, string choice) {
    if ( field == null ) {
        throw new ArgumentNullException("field");
    }

    field.Choices.Add(choice);
    field.Update(true);

    SPFieldLink fieldLink = new SPFieldLink(field);

    foreach ( SPList list in web.Lists ) {
        if ( !list.ContentTypesEnabled ) continue;

        bool update = false;

        foreach ( SPContentType contentType in list.ContentTypes ) {
            if ( contentType.FieldLinks[field.Id] == null ) continue;

            update = true;

            string[] order = ( from SPFieldLink f in contentType.FieldLinks select f.Name ).ToArray();

            contentType.FieldLinks.Delete(field.Id);
            contentType.FieldLinks.Add(fieldLink);
            contentType.FieldLinks.Reorder(order);

            contentType.Update(true);
        }

        if ( update ) {
            list.Update(true);
        }
    }
}
Foi útil?

Solução 2

Eu descobri.Tenho que atualizar manualmente o recurso para acionar a atualização do recurso.Atualizar a solução por si só não faz isso.A maneira mais preguiçosa de fazer isso é em http://spfeatureupgrade.codeplex.com/.

Depois de descobrir isso, tudo o que preciso fazer para enviar minha alteração para a lista é ligar SPContentType.Update(true) no meu tipo de conteúdo.Meu código é o seguinte:

EventReciever.cs

public override void FeatureUpgrading(SPFeatureReceiverProperties properties, string upgradeActionName, System.Collections.Generic.IDictionary<string, string> parameters)
{
    SPWeb web = (SPWeb)properties.Feature.Parent;

    switch ( upgradeActionName ) {
        case "PushFieldUpdatesToList":
            PushFieldUpdatesToList(web.Fields[new Guid(parameters["FieldID"])]);
            break;
    }
}

protected static void PushFieldUpdatesToList(SPField field) {
    if ( field == null ) {
        throw new ArgumentNullException("field");
    }

    field.Update(true);
}

Modelo.xml

<?xml version="1.0" encoding="utf-8" ?>
<Feature xmlns="http://schemas.microsoft.com/sharepoint/">
    <UpgradeActions>
        <VersionRange BeginVersion="0.0.0.0" EndVersion="1.0.1.0">
            <CustomUpgradeAction Name="PushFieldUpdatesToList">
                <Parameters>
                    <Parameter Name="FieldID">{82E08EC3-0C5C-4565-B0D1-740BDBE4FA93}</Parameter>
                </Parameters>
            </CustomUpgradeAction>
        </VersionRange>
    </UpgradeActions>
</Feature>

Espero que isso ajude alguém.Não é exatamente o processo mais intuitivo.Obrigado novamente pelo seu tempo.

Outras dicas

EDITAR:Da última vez, tentei dar uma resposta de memória, sem verificá-la, e estava errado.Desculpe por isso.Não vou disparar novamente uma resposta mal pensada.Desta vez criei uma lista com dois tipos de conteúdo, ambos com um campo de escolha denominado 'região'.Então, em um aplicativo de console, executei este código:

 SPList list = web.Lists.TryGetList("blah");
 if (list != null)
 {                   
     SPFieldChoice fld = list.Fields["region"] as SPFieldChoice;
     fld.Choices.Add("southwest");
     fld.Update();
 }

Isso atualizou o campo de escolha em ambos os tipos de conteúdo da lista.Espero que seja isso que você procura.Ele deve ser executado sem modificações em um receptor de recursos.

Além disso, observe que isso NÃO funcionará na sandbox.Parecerá funcionar ao percorrer o código, mas o campo não será atualizado.Ao que tudo indica, deveria funcionar, mas não funciona.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a sharepoint.stackexchange
scroll top