Domanda

C'è un grosso pezzo del puzzle che mi manca qui.

Ho una lista con i tipi di contenuto abilitati.Sto cercando programmaticamente di aggiungere un'opzione per alcuni campi di scelta nel metodo FeaturePgrading.I campi nella raccolta del campo si stanno aggiornando, ma i campi dei campi di contenuto dei campi non sono.

Codice di seguito:

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);
}
.

Template.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>
.

Grazie per il tuo tempo.

Aggiornamento:

Secondo il commento di Derek Gusoff qui sotto, ho cambiato il mio metodo AddChaice sul seguente codice seguente.Continua a non funzionare.Sono ancora molto perso su come dovresti farlo.

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);
        }
    }
}
.

È stato utile?

Soluzione 2

L'ho capito.Devo aggiornare manualmente la funzionalità per attivare l'aggiornamento della funzione.Aggiornamento della soluzione da solo non lo fa.Il modo più mio di fare questo è a http://spfeatureUpgrade.codeplex.com/ .

Una volta che ho capito questo, tutto ciò che devo fare per spingere la mia modifica all'elenco è chiamare SPContentType.Update(true) sul mio tipo di contenuto.Il mio codice è il seguente:

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);
}
.

Template.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>
.

Spero che questo aiuti a qualcun altro fuori.Non è esattamente il processo più intuitivo.Grazie ancora per il tuo tempo.

Altri suggerimenti

Modifica: L'ultima volta ho provato a darti una risposta dalla memoria senza verificarlo, ed è stato sbagliato.Mi dispiace per quello.Non licenzierò di nuovo una risposta scarsamente pensata.Questa volta ho creato un elenco con due tipi di contenuti, entrambi avevano un campo da scelta denominato "regione".Quindi in un'app console ho eseguito questo codice:

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

Questo ha aggiornato il campo Choice in entrambi i tipi di contenuto nell'elenco.Spero che questo sia ciò che stai cercando.Dovrebbe funzionare senza modifiche in un ricevitore funzionalità.

Inoltre, nota che questo non funzionerà nella sandbox.Sembrerà funzionare quando si passa attraverso il codice, ma il campo non si aggiornerà.Da tutti gli account dovrebbe funzionare ma non lo fa.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a sharepoint.stackexchange
scroll top