2009-07-30 153 views
0

我有一个InfoPath表单和自定义提交代码,通过调用Sharepoint Lists Web服务来更新Sharepoint列表。代码无任何例外地运行,并且我能够设置断点以确保变量在发送到Web服务之前包含正确的值。尽管如此,这些值永远不会被添加到Sharepoint列表中。这里是我的代码:从.NET访问Sharepoint列表Web服务

[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

不降低投票或投票结束,但...你忘了问一个问题吗? – 2009-07-30 17:28:35

+0

Lol很好的电话。编辑。 – Jared 2009-07-30 18:23:05

回答

1

好吧,我终于想出了这个愚蠢的bug。根目录Sharepoint站点上有一个列表,其显示名称与我试图在我的子网站上访问的列表相同。即使我的服务引用指向位于我的子网站上的列表Web服务,它仍然返回错误的列表。我用我的名单的内部名称,现在它的作品。

0

从文档上MSDN建议您使用大括号(即“{GUID}”),但你也可以使用列表显示包围名单GUID名称。

那些大括号似乎在您的电话中缺失。

+0

是的,我注意到这一点,但我已经试过和没有,它似乎没有区别。 – Jared 2009-07-30 19:00:24

1

两件事情:

  1. 您也可以致电UpdateListItems()时,需要在批次默认视图ID。

  2. 您可以通过调用listService.GetListAndView()以编程方式获取它,而不是对列表guid进行硬编码。

下面是一些代码来说明两个项目:

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

那么你可以调用UpdateListItems()与listGuid和批次。

0

我发现我的问题的部分答案。当我将服务引用添加到我正在处理的子网站时,出于某种原因,app.config仍包含对根Sharepoint站点的引用。因此,我正在寻找的名单不存在。不过,现在我又遇到了另一个问题。我检查了UpdateListItems()调用的返回值,并且出现以下错误:“一个或多个字段类型未正确安装。转至列表设置页面以删除这些字段。”我周围搜索,导致这个错误的所有问题似乎都涉及到一个字段名称,其中有一个空格。不过,我的两个领域都没有空间。这里是我更新的代码:

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