Modèle objet client - Mettre à jour les métadonnées de la bibliothèque de documents - Champ de recherche sans valeur requise

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

Question

J'essaie de mettre à jour les métadonnées des documents dans une bibliothèque de documents (ou une liste) à l'aide du modèle objet client.J'ai réduit un certain nombre de messages d'erreur que je recevais et je me retrouve maintenant face à un nouveau problème :

Un certain nombre de champs de métadonnées dans le type de contenu de ces éléments sont des champs de recherche, et un certain nombre de ces recherches sont à sélection multiple.La plupart d'entre eux ne sont pas obligatoires, mais lorsque je teste l'application, je reçois des erreurs de SharePoint m'indiquant que « la propriété de métadonnées [numéro de modèle de vente] est requise », ce qui n'est tout simplement pas vrai.

Comment puis-je mettre une valeur vide dans un champ de recherche à sélection multiple ou éviter cette erreur ?

    private void DoMetadataUpdateEx(DataRow row, ListItem item)
    {

        if (item.File != null || _sharePoint.CurrentList.ForceCheckout)
        {
            try
            {
                item.File.CheckOut();
                _sharePoint.Context.ExecuteQuery();
            }
            catch (Exception) { }
        }


        foreach (MetaMap mm in _metaMapping)
        {
            if (mm.ForceUse)
            {
                //Field f = _sharePoint.CurrentList.Fields.GetByInternalNameOrTitle(mm.SharePointColumn);
                Field f = _sharePoint.GetCurrentFieldByTitle(mm.SharePointColumn);
                switch (f.FieldTypeKind)
                {
                    case FieldType.MultiChoice:
                        string[] mcvals = row[mm.ExcelColumn].ToString().Split(',', ';');
                        item[f.InternalName] = mcvals;
                        break;
                    case FieldType.Lookup:
                        if((f as FieldLookup).AllowMultipleValues)
                        {
                            string[] mlvals = row[mm.ExcelColumn].ToString().Split(',', ';');
                            List<FieldLookupValue> newVals = new List<FieldLookupValue>();

                            FieldLookupValue[] oitemsalesmodelnum = (FieldLookupValue[])item[f.InternalName];
                            foreach (string ev in mlvals)
                            {
                                ListItem li = _sharePoint.GetLookupValue(f as FieldLookup, ev);
                                if (li == null)
                                {
                                    continue;
                                }
                                FieldLookupValue flv = new FieldLookupValue();
                                flv.LookupId = li.Id;

                                newVals.Add(flv);
                            }
                            if (newVals.Count > 0)
                            {
                                item[f.InternalName] = newVals.ToArray<FieldLookupValue>();
                            }
                            else
                            {
                                newVals.Add(new FieldLookupValue());
                                item[f.InternalName] = newVals.ToArray<FieldLookupValue>();
                            }
                        }
                        else
                        {
                            ListItem li = _sharePoint.GetLookupValue(f as FieldLookup, row[mm.ExcelColumn].ToString());
                            if (li != null)
                            {
                                FieldLookupValue flv = new FieldLookupValue();
                                flv.LookupId = li.Id;
                                item[f.InternalName] = flv;
                            }
                        }
                        break;
                    case FieldType.Computed:
                        throw new NotImplementedException("Computed columns are not yet implemented");
                    case FieldType.Integer:
                        item[f.InternalName] = Int32.Parse(row[mm.ExcelColumn].ToString());
                        break;
                    default:
                        item[f.InternalName] = row[mm.ExcelColumn].ToString();
                        break;

                }
            }
        }

        item.Update();
        //_sharePoint.Context.Load(item);
        item.Context.ExecuteQuery();


        if (item.File != null || _sharePoint.CurrentList.ForceCheckout)
        {
            try
            {
                item.File.CheckOut();
                _sharePoint.Context.ExecuteQuery();
            }
            catch (Exception)  // ignore checkout exception
            { }
            item.File.CheckIn("Modified by SP2010 Excel List Updater", CheckinType.MajorCheckIn);
            _sharePoint.Context.ExecuteQuery();
        }


    }// end DoMetadataUpdateEx()

* MISE À JOUR *

DONC, j'ai apporté quelques modifications, notamment en ajoutant la valeur qui manquait dans la recherche précédente à la liste de recherche, et j'ai obtenu la même erreur.Ainsi, le champ se voyait maintenant attribuer une valeur légitime, et il génère toujours cette erreur « le champ est obligatoire ».Pas drôle.J'ai l'impression qu'il y a peut-être quelque chose qui ne va pas avec le domaine lui-même...Est-ce que quelqu'un a des idées ?Je vais probablement fouiller un peu plus, puis supprimer et recréer complètement le champ.

*MISE À JOUR 2*

Faire un peu plus de débogage m'a conduit à la découverte suivante :Après les appels Update() et ExecuteQuery(), l'élément revient à ses métadonnées d'origine, donc lorsque j'essaie de l'archiver, il applique des valeurs non valides, d'où le message d'erreur.Maintenant, je suis vraiment confus.Peut-être dois-je effectuer la mise à jour et l'enregistrement au cours du même ExecuteQuery() au lieu d'essayer de faire d'abord la mise à jour, puis de m'enregistrer plus tard ?

Merci,

  • Mat
Était-ce utile?

La solution

OK, donc je pense avoir résolu mon problème.En fait, il se passait deux choses ici :

1) Une connexion WCF propage les mises à jour des métadonnées lors de l'enregistrement vers une autre application Web (ASP.NET).Le domaine sur lequel je recevais constamment des messages EST requis sur ce site.Je ne m'attendrais pas à ce que quiconque ici comprenne cela.J'ai créé le champ requis dans SharePoint et défini de fausses valeurs par défaut afin de pouvoir tester la mise à jour de mon application.

2) Après avoir résolu ce problème, j'ai remarqué que les choses commençaient enfin à s'enregistrer, mais aucun (enfin, UN) des champs n'était mis à jour.J'ai joué un peu plus avec et j'ai découvert que si je faisais un Update() appeler chaque fois que je parcourais les champs, cela les mettrait également à jour dans SharePoint.Cela ressemble à l'appel à Update() auparavant, il ne mettait à jour que le dernier champ de métadonnées à définir, ou quelque chose comme ça.

Nouveau code :

    private void DoMetadataUpdateEx(DataRow row, ListItem item)
    {
        ListItem updateItem = item;

        if (item.File != null || _sharePoint.CurrentList.ForceCheckout)
        {
            updateItem = item.File.ListItemAllFields;
            _sharePoint.Context.Load(updateItem);
            _sharePoint.Context.ExecuteQuery();
            try
            {
                item.File.CheckOut();
                _sharePoint.Context.ExecuteQuery();
            }
            catch (Exception) { }
        }

        foreach (MetaMap mm in _metaMapping)
        {
            if (mm.ForceUse)
            {
                //Field f = _sharePoint.CurrentList.Fields.GetByInternalNameOrTitle(mm.SharePointColumn);
                Field f = _sharePoint.GetCurrentFieldByTitle(mm.SharePointColumn);
                switch (f.FieldTypeKind)
                {
                    case FieldType.MultiChoice:
                        string[] mcvals = row[mm.ExcelColumn].ToString().Split(',', ';');
                        updateItem[f.InternalName] = mcvals;
                        break;
                    case FieldType.Lookup:
                        if((f as FieldLookup).AllowMultipleValues)
                        {
                            string[] mlvals = row[mm.ExcelColumn].ToString().Split(',', ';');
                            List<FieldLookupValue> newVals = new List<FieldLookupValue>();

                            FieldLookupValue[] oitemsalesmodelnum = (FieldLookupValue[])item[f.InternalName];
                            foreach (string ev in mlvals)
                            {
                                ListItem li = _sharePoint.GetLookupValue(f as FieldLookup, ev);
                                if (li == null)
                                {
                                    continue;
                                }
                                FieldLookupValue flv = new FieldLookupValue();
                                flv.LookupId = li.Id;

                                newVals.Add(flv);
                            }
                            if (newVals.Count > 0)
                            {
                                updateItem[f.InternalName] = newVals.ToArray<FieldLookupValue>();
                            }
                            else
                            {
                                newVals.Add(new FieldLookupValue());
                                updateItem[f.InternalName] = newVals.ToArray<FieldLookupValue>();
                            }
                        }
                        else
                        {
                            ListItem li = _sharePoint.GetLookupValue(f as FieldLookup, row[mm.ExcelColumn].ToString());
                            if (li != null)
                            {
                                FieldLookupValue flv = new FieldLookupValue();
                                flv.LookupId = li.Id;
                                updateItem[f.InternalName] = flv;
                            }
                        }
                        break;
                    case FieldType.Computed:
                        throw new NotImplementedException("Computed columns are not yet implemented");
                    case FieldType.Integer:
                        updateItem[f.InternalName] = Int32.Parse(row[mm.ExcelColumn].ToString());
                        break;
                    default:
                        updateItem[f.InternalName] = row[mm.ExcelColumn].ToString();
                        break;

                }
            }
            updateItem.Update();
        }

        //updateItem.Update();

        if (item.File != null || _sharePoint.CurrentList.ForceCheckout)
        {
            item.File.CheckIn("Modified by SP2010 Excel List Updater", CheckinType.MajorCheckIn);
        }
        else
        {
            _sharePoint.Context.ExecuteQuery();
        }
    }// end DoMetadataUpdateEx()
Licencié sous: CC-BY-SA avec attribution
Non affilié à sharepoint.stackexchange
scroll top