2009-07-30 8 views
0

Ich habe ein InfoPath-Formular mit benutzerdefiniertem Übermittlungscode, um eine Sharepoint-Liste durch Aufrufen des Sharepoint Lists-Webdiensts zu aktualisieren. Der Code wird ohne Ausnahmen ausgeführt, und ich konnte Haltepunkte festlegen, um sicherzustellen, dass die Variablen die richtigen Werte enthalten, bevor sie an den Webdienst gesendet werden. Die Werte werden jedoch niemals der Sharepoint-Liste hinzugefügt. Hier ist mein Code:Zugriff auf den SharePoint-Listen-Webdienst von .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

Noch nicht abstimmen oder abstimmen, aber ... hast du vergessen eine Frage zu stellen? –

+0

Lol guten Ruf. Bearbeitet. – Jared

Antwort

1

Ok, endlich habe ich diesen dummen Bug raus gefunden. Es gab eine Liste auf der SharePoint-Stammwebsite mit demselben Anzeigenamen wie die Liste, auf die ich auf meiner Unterwebsite zugreifen wollte. Obwohl meine Servicereferenz auf den Lists-Webdienst auf meiner Unterwebsite verweist, gab sie immer noch die falsche Liste zurück. Ich habe den internen Namen für meine Liste verwendet und jetzt funktioniert es.

0

Aus der Dokumentation auf MSDN: Es wird empfohlen, dass Sie die Liste GUID von geschweiften Klammern verwenden (dh „{GUID}“), aber Sie können auch die Listenanzeige verwenden Name.

Diese geschweiften Klammern scheinen in Ihrem Anruf zu fehlen.

+0

Ja, das habe ich auch bemerkt, aber ich habe es sowohl mit als auch ohne ausprobiert und es scheint keinen Unterschied zu machen. – Jared

1

Zwei Dinge:

  1. Möglicherweise müssen auch die Standardansicht ID in Batch, wenn Updatelist() aufrufen.

  2. Anstatt die Listen-GUID fest zu codieren, können Sie sie programmatisch durch Aufruf von listService.GetListAndView() abrufen.

Hier einige Code beide Elemente zu demonstrieren:

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

können Sie dann rufen Sie einfach Updatelist() mit listGuid und Charge.

0

Ich fand eine teilweise Antwort auf mein Problem. Als ich die Dienstreferenz zu der Unterwebsite hinzufügte, an der ich arbeite, enthielt app.config aus irgendeinem Grund immer noch einen Verweis auf die Root-Sharepoint-Site. Daher existierte die von mir gesuchte Liste nicht. Jetzt habe ich ein anderes Problem. Ich überprüfe den Rückgabewert des UpdateListItems() -Aufrufs, und ich erhalte den folgenden Fehler: "Ein oder mehrere Feldtypen sind nicht richtig installiert. Gehen Sie auf die Listeneinstellungen, um diese Felder zu löschen." Ich suchte herum und alle Probleme, die diesen Fehler verursachen, scheinen einen Feldnamen mit einem Leerzeichen darin zu enthalten. Keines meiner Felder enthält jedoch Leerzeichen. Hier ist mein aktualisierter Code:

 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

Dieser Fehler tritt auch auf, wenn Sie eine Abfrage ausführen, die Felder in der WHERE-Klausel enthält, die nicht in der Liste enthalten sind. – Colin

+0

Nun, ich frage nichts, aber die Felder, auf die ich im Batch-XML verweisen, existieren beide. Außerdem versuchte ich einen ähnlichen Aufruf von GetListItems, wo ich versuche, auf das RiskID-Feld aller Elemente in der Liste zuzugreifen, und ich bekomme den gleichen Fehler. – Jared