Frage

Es gibt ein großes Puzzleteil, das mir hier fehlt.

Ich habe eine Liste mit aktivierten Inhaltstypen.Ich versuche programmgesteuert, einigen Auswahlfeldern in der Feature-Upgrading-Methode eine Option hinzuzufügen.Die Felder in der Feldsammlung werden aktualisiert, die Felder in den Inhaltstypen der Liste jedoch nicht.

Code unten:

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

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

Vielen Dank für Ihre Zeit.

Aktualisieren:

Laut Derek Gusoffs Kommentar unten habe ich meine AddChoice-Methode in den folgenden Code unten geändert.Funktioniert immer noch nicht.Ich weiß immer noch nicht, wie man das machen soll.

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);
        }
    }
}
War es hilfreich?

Lösung 2

Ich habe es herausgefunden.Ich muss die Funktion manuell aktualisieren, um die Funktionsaktualisierung auszulösen.Durch ein Upgrade der Lösung allein wird dies nicht erreicht.Der einfachste Weg, dies zu tun, ist unter http://spfeatureupgrade.codeplex.com/.

Sobald ich das herausgefunden habe, muss ich nur noch anrufen, um meine Änderung in die Liste zu übertragen SPContentType.Update(true) auf meinen Inhaltstyp.Mein Code ist wie folgt:

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

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

Ich hoffe, das hilft jemand anderem.Es ist nicht gerade der intuitivste Prozess.Nochmals vielen Dank für Ihre Zeit.

Andere Tipps

edit: Letztes Mal habe ich versucht, Ihnen eine Antwort von der Erinnerung zu geben, ohne es zu überprüfen, und es war falsch.Das tut mir leid.Ich werde noch einmal eine schlechtdurchdachte Antwort ablösen.Diesmal habe ich eine Liste mit zwei Inhaltstypen erstellt, die beide ein Auswahlfeld namens "Region" hatten.Dann habe ich in einer Konsolen-App diesen Code geführt: generasacodicetagpre.

Dies aktualisiert das Auswahlfeld in beiden Inhaltstypen auf der Liste.Ich hoffe das ist, was du danach bist.Es sollte keine Änderungen in einem Feature-Empfänger laufen.

auch, dass dies nicht in der Sandbox funktioniert.Es scheint zu funktionieren, wenn Sie den Code fortschreiten, aber das Feld wird nicht aktualisiert.Bei allen Berichten sollte es funktionieren, aber es nicht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit sharepoint.stackexchange
scroll top