Question

J'ai un formulaire InfoPath avec un code de soumission personnalisé pour mettre à jour une liste Sharepoint en appelant le service Web Listes Sharepoint. Le code s'exécute sans 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. Les valeurs ne sont jamais ajoutées à la liste Sharepoint, cependant. Voici mon code:

[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;
        }
    }
Était-ce utile?

La solution 2

Ok, j'ai finalement compris que ce stupide bug était sorti. Il y avait une liste sur le site SharePoint Sharepoint racine 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 indiquait le service Web Lists situé sur mon sous-site, il renvoyait toujours la liste erronée. J'ai utilisé le nom interne pour ma liste et maintenant cela fonctionne.

Autres conseils

Deux choses:

  1. Vous pouvez également avoir besoin de l'ID d'affichage par défaut dans votre lot lorsque vous appelez UpdateListItems ().

  2. Au lieu de coder en dur la liste guid, vous pouvez l'obtenir par programmation en appelant listService.GetListAndView ().

Voici du code pour illustrer 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 ensuite simplement appeler UpdateListItems () avec listGuid et batch.

D'après la documentation sur MSDN : < em> Il est recommandé d'utiliser la liste GUID entourée d'accolades ("{GUID}"), mais vous pouvez également utiliser le nom d'affichage de la liste.

Ces accolades semblent manquer à votre appel.

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, app.config contenait toujours une référence au site racine Sharepoint. 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 le message d'erreur suivant: " Un ou plusieurs types de champs ne sont pas installés correctement. Accédez à la page des paramètres de la liste pour supprimer ces champs. & Quot; J'ai cherché autour et tous les problèmes qui causent cette erreur semblent impliquer d'avoir un nom de champ avec un espace. Ni l'un ni l'autre 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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top