2009-07-30 7 views
0

J'ai un formulaire InfoPath avec un code de soumission personnalisé pour mettre à jour une liste Sharepoint en appelant le service Web Listes de points de partage. Le code s'exécute sans aucune exception et j'ai pu définir des points d'arrêt pour m'assurer que les variables contiennent les valeurs correctes avant d'être envoyées au service Web. Cependant, les valeurs ne sont jamais ajoutées à la liste Sharepoint. Voici mon code:Accès au service Web Listes de SharePoint à partir de .NET

[InfoPathEventHandler(MatchPath = "Submit", EventType = InfoPathEventType.OnClick)] 
    public void Submit_OnClick(DocActionEvent e) 
    { 
     ListsService.Lists listService = new Risk_Form.ListsService.Lists(); 
     listService.Credentials = System.Net.CredentialCache.DefaultCredentials; 

     string riskID = thisXDocument.DOM.selectSingleNode("//my:myFields/my:RiskID").text; 
     string headline = thisXDocument.DOM.selectSingleNode("//my:myFields/my:RiskHeadline").text; 

     XmlDocument doc = new XmlDocument(); 
     XmlElement batch = doc.CreateElement("Batch"); 
     batch.SetAttribute("OnError", "Continue"); 
     batch.SetAttribute("ListVersion", "1"); 

     batch.InnerXml = 
      "<Method ID='" + riskID + "' Cmd='New'>" + 
       "<Field Name='RiskID'>" + riskID + "</Field>" + 
       "<Field Name='Headline'>" + headline + "</Field>" + 
      "</Method>"; 
     try 
     { 
      // Update list using the list's GUID 
      listService.UpdateListItems("2F6CA5F4-D78A-4716-B111-507917CF89E4", batch); 
     } 
     catch(Exception ex) 
     { 
      thisXDocument.DOM.selectSingleNode("//my:myFields/my:RiskStatement").text = ex.Message; 
     } 
    } 
+0

Pas de vote à la baisse ou de vote pour terminer, mais ... avez-vous oublié de poser une question? –

+0

Lol bon appel. Édité. – Jared

Répondre

1

Ok, j'ai finalement pensé que ce bug stupide. Il y avait une liste sur le site racine Sharepoint avec le même nom d'affichage que la liste à laquelle j'essayais d'accéder sur mon sous-site. Même si ma référence de service pointait vers le service Web Listes situé sur mon sous-site, il renvoyait toujours la mauvaise liste. J'ai utilisé le nom interne de ma liste et maintenant cela fonctionne.

0

De la documentation sur MSDN: Il est recommandé d'utiliser le GUID liste entouré par des accolades (par exemple, « {GUID} »), mais vous pouvez également utiliser l'affichage de la liste prénom.

Ces accolades semblent manquer à votre appel.

+0

Oui, j'ai remarqué ça aussi, mais j'ai essayé à la fois avec et sans et ça ne semble pas faire de différence. – Jared

1

Deux choses:

  1. Vous pourriez aussi avoir besoin de la vue par défaut ID dans votre lot lors de l'appel UpdateListItems(). Au lieu de coder en dur la liste guid, vous pouvez l'obtenir par programmation en appelant listService.GetListAndView().

Voici un code pour démontrer les deux éléments:

System.Xml.XmlNode ndListView = listService.GetListAndView(DISPLAYNAMEOFLIST, ""); 
string listGuid = ndListView.ChildNodes[0].Attributes["Name"].Value; 
string listView = ndListView.ChildNodes[1].Attributes["Name"].Value; 

batch.SetAttribute("ViewName", listView); 

Vous pouvez alors simplement appeler UpdateListItems() avec listGuid et lot.

0

J'ai trouvé une réponse partielle à mon problème. Lorsque j'ai ajouté la référence de service au sous-site sur lequel je travaille, pour une raison quelconque, app.config contenait toujours une référence au site Sharepoint racine. Par conséquent, la liste que je cherchais n'existait pas. Maintenant, j'ai un autre problème, cependant. Je vérifie la valeur de retour de l'appel UpdateListItems(), et j'obtiens l'erreur suivante: "Un ou plusieurs types de champs ne sont pas installés correctement Allez à la page de paramètres de liste pour supprimer ces champs." J'ai cherché autour et tous les problèmes qui causent cette erreur semblent impliquer d'avoir un nom de champ avec un espace dedans. Cependant, aucun de mes champs ne contient d'espaces. Voici mon code mis à jour:

 ListsService.Lists listService = new Risk_Form.ListsService.Lists(); 
     listService.Credentials = System.Net.CredentialCache.DefaultCredentials; 
     XmlNode list = null; 

     list = listService.GetListAndView("Risks", ""); 

     string listID = list.ChildNodes[0].Attributes["Name"].Value; 
     string viewID = list.ChildNodes[1].Attributes["Name"].Value; 

     string riskID = thisXDocument.DOM.selectSingleNode("//my:myFields/my:RiskID").text; 
     string headline = thisXDocument.DOM.selectSingleNode("//my:myFields/my:RiskHeadline").text; 

     XmlDocument doc = new XmlDocument(); 
     XmlElement batch = doc.CreateElement("Batch"); 
     batch.SetAttribute("OnError", "Continue"); 
     batch.SetAttribute("ListVersion", "1"); 
     batch.SetAttribute("ViewName", viewID); 

     batch.InnerXml = 
      "<Method ID='1' Cmd='New'>" + 
       "<Field Name='RiskID'>" + riskID + "</Field>" + 
       "<Field Name='Headline'>" + headline + "</Field>" + 
      "</Method>"; 

     XmlNode ret = listService.UpdateListItems(listID, batch); 
     MessageBox.Show(ret.OuterXml); 
+1

cette erreur se produit également lorsque vous effectuez une requête qui inclut des champs dans la clause where qui ne figurent pas dans la liste. – Colin

+0

Eh bien, je ne demande rien, mais les champs auxquels je me réfère dans le lot XML existent à la fois. En outre, j'ai essayé un appel similaire à GetListItems où j'essaie d'accéder au champ RiskID de tous les éléments de la liste, et j'obtiens la même erreur. – Jared

Questions connexes