Les SPFields dans une liste avec les types de contenu activés ne se mettent pas à jour comme prévu

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

  •  09-12-2019
  •  | 
  •  

Question

Il y a une grosse pièce du puzzle qui me manque ici.

J'ai une liste avec les types de contenu activés.J'essaie par programme d'ajouter une option à certains champs de choix dans la méthode featureupgrading.Les champs de la collection de champs sont mis à jour, mais pas les champs des types de contenu de la liste.

Code ci-dessous :

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

Modèle.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>

Merci pour votre temps.

Mise à jour:

Selon le commentaire de Derek Gusoff ci-dessous, j'ai modifié ma méthode AddChoice par le code suivant ci-dessous.Ne fonctionne toujours pas.Je ne sais toujours pas comment vous êtes censé procéder.

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);
        }
    }
}
Était-ce utile?

La solution 2

Je l'ai compris.Je dois mettre à niveau manuellement la fonctionnalité pour déclencher la mise à niveau des fonctionnalités.La mise à niveau de la solution en elle-même ne permet pas cela.La façon la plus paresseuse de procéder est de http://spfeatureupgrade.codeplex.com/.

Une fois que j'ai compris cela, tout ce que j'ai à faire pour apporter ma modification à la liste est d'appeler SPContentType.Update(true) sur mon type de contenu.Mon code est le suivant :

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

Modèle.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>

J'espère que cela aidera quelqu'un d'autre.Ce n'est pas exactement le processus le plus intuitif.Merci encore pour votre temps.

Autres conseils

EDIT: La dernière fois que j'ai essayé de vous donner une réponse de la mémoire sans le vérifier, et c'était faux.Désolé pour ça.Je ne tirerai plus loin d'une réponse mal pensée.Cette fois, j'ai créé une liste avec deux types de contenu, qui ont tous deux reçu un champ de choix nommé «région».Ensuite, dans une console, j'ai exécuté ce code:

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

Ceci a mis à jour le champ de choix dans les deux types de contenu sur la liste.J'espère que c'est ce que vous êtes après.Il devrait fonctionner sans modification dans un récepteur de caractéristiques.

Aussi, notez que cela ne fonctionnera pas dans le bac à sable.Il semblera de travailler lors de la progression du code, mais le champ ne sera pas mis à jour.Par tous les comptes, cela devrait fonctionner mais ce n'est pas le cas.

Licencié sous: CC-BY-SA avec attribution
Non affilié à sharepoint.stackexchange
scroll top