Pregunta

Hay una gran pieza del rompecabezas que me falta aquí.

Tengo una lista con tipos de contenido habilitados.Estoy intentando agregar mediante programación una opción a algunos campos de elección en el método de actualización de funciones.Los campos de la colección de campos se están actualizando, pero los campos de los tipos de contenido de la lista no.

Código a continuación:

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

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

Gracias por tu tiempo.

Actualizar:

Según el comentario de Derek Gusoff a continuación, cambié mi método AddChoice al siguiente código a continuación.Sigue sin funcionar.Todavía estoy muy perdido en cómo se supone que debes hacer esto.

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);
        }
    }
}
¿Fue útil?

Solución 2

Me lo imaginé.Tengo que actualizar manualmente la función para activar la actualización.Actualizar la solución por sí solo no soluciona este problema.La forma más perezosa de hacer esto es en http://spfeatureupgrade.codeplex.com/.

Una vez que descubrí esto, todo lo que necesito hacer para enviar mi cambio a la lista es llamar SPContentType.Update(true) en mi tipo de contenido.Mi código es el siguiente:

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

Plantilla.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 esto ayude a alguien más.No es exactamente el proceso más intuitivo.Gracias de nuevo por tu tiempo.

Otros consejos

Editar: La última vez que intenté darle una respuesta de la memoria sin verificarla, y fue incorrecto.Lo siento por eso.No volveré a disparar una respuesta mal pensada nuevamente.Esta vez creé una lista con dos tipos de contenido, los cuales tuvieron un campo de elección llamado 'región'.Luego, en una aplicación de consola, corrí 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();
 }

Esto actualizó el campo de elección en ambos tipos de contenido en la lista.Espero que esto sea lo que buscas.Debe ejecutarse sin modificaciones en un receptor de características.

Además, tenga en cuenta que esto no funcionará en la caja de arena.Parecerá que funcionará al pasar por el código, pero el campo no se actualizará.Por todas las cuentas debería funcionar pero no lo hace.

Licenciado bajo: CC-BY-SA con atribución
scroll top