Modèle objet client - Mettre à jour les métadonnées de la bibliothèque de documents - Champ de recherche sans valeur requise
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
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()