Domanda

Ho un modulo di InfoPath con codice di invio personalizzato per aggiornare un elenco di Sharepoint chiamando il servizio web Elenchi di SharePoint. Il codice viene eseguito senza eccezioni e sono stato in grado di impostare i punti di interruzione per assicurarmi che le variabili contengano i valori corretti prima di essere inviati al servizio web. Tuttavia, i valori non vengono mai aggiunti all'elenco Sharepoint. Ecco il mio codice:

[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;
        }
    }
È stato utile?

Soluzione 2

Ok, ho finalmente capito questo stupido bug. Sul sito di Sharepoint principale era presente un elenco con lo stesso nome visualizzato dell'elenco a cui stavo tentando di accedere sul mio sito secondario. Anche se il mio riferimento al servizio indicava il servizio Web Elenchi situato sul mio sito secondario, stava ancora restituendo l'elenco errato. Ho usato il nome interno per il mio elenco e ora funziona.

Altri suggerimenti

Due cose:

  1. Potrebbe anche essere necessario l'ID visualizzazione predefinito nel batch quando si chiama UpdateListItems ().

  2. Invece di inserire un codice nella guida dell'elenco, è possibile ottenerlo programmaticamente chiamando listService.GetListAndView ().

Ecco un codice per dimostrare entrambi gli elementi:

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

È quindi possibile chiamare UpdateListItems () con listGuid e batch.

Dalla documentazione su MSDN : < em> Si consiglia di utilizzare il GUID dell'elenco circondato da parentesi graffe (ad es. " {GUID} "), ma è anche possibile utilizzare il nome visualizzato dell'elenco.

Quelle parentesi graffe sembrano mancare nella tua chiamata.

Ho trovato una risposta parziale al mio problema. Quando ho aggiunto il riferimento del servizio al sito secondario su cui sto lavorando, per qualche ragione app.config conteneva ancora un riferimento al sito principale di Sharepoint. Pertanto l'elenco che stavo cercando non esisteva. Ora sto avendo un altro problema, però. Controllo il valore restituito della chiamata UpdateListItems () e visualizzo il seguente errore: " Uno o più tipi di campo non sono installati correttamente. Vai alla pagina delle impostazioni dell'elenco per eliminare questi campi. & Quot; Ho cercato in giro e tutti i problemi che causano questo errore sembrano comportare un nome di campo con uno spazio al suo interno. Nessuno dei miei campi ha spazi in essi, però. Ecco il mio codice aggiornato:

        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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top