我有一个InfoPath表单,其中包含自定义提交代码,可通过调用Sharepoint Lists Web服务来更新Sharepoint列表。代码运行没有任何异常,我能够设置断点以确保变量在发送到Web服务之前包含正确的值。但是,值永远不会添加到Sharepoint列表中。这是我的代码:
[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 :(得分:1)
两件事:
调用UpdateListItems()时,您可能还需要批处理中的默认View ID。
您可以通过调用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);
然后,您可以使用listGuid和batch调用UpdateListItems()。
答案 1 :(得分:1)
好吧,我终于想出了这个愚蠢的错误。根Sharepoint站点上有一个列表,其显示名称与我尝试在子站点上访问的列表相同。即使我的服务引用指向位于我的子网站上的列表Web服务,它仍然返回错误的列表。我使用了我的列表的内部名称,现在它可以工作。
答案 2 :(得分:0)
从MSDN上的文档:建议您使用大括号括起来的列表GUID(即“{GUID}”),但您也可以使用列表显示名称。 / em>的
你的电话中似乎缺少那些花括号。
答案 3 :(得分: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);