C# 从.NET访问Sharepoint列表Web服务
我有一个带有自定义提交代码的InfoPath表单,可通过调用Sharepoint列表web服务更新Sharepoint列表。代码运行时没有任何异常,我能够设置断点,以确保变量在发送到web服务之前包含正确的值。但是,这些值从未添加到Sharepoint列表中。这是我的密码:C# 从.NET访问Sharepoint列表Web服务,c#,.net,web-services,sharepoint,infopath,C#,.net,Web Services,Sharepoint,Infopath,我有一个带有自定义提交代码的InfoPath表单,可通过调用Sharepoint列表web服务更新Sharepoint列表。代码运行时没有任何异常,我能够设置断点,以确保变量在发送到web服务之前包含正确的值。但是,这些值从未添加到Sharepoint列表中。这是我的密码: [InfoPathEventHandler(MatchPath = "Submit", EventType = InfoPathEventType.OnClick)] public void Submit_OnCli
[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;
}
}
[InfoPathEventHandler(MatchPath=“Submit”,EventType=InfoPathEventType.OnClick)]
公共作废提交点击(DocActionEvent e)
{
ListsService.Lists ListsService=新风险_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=新的XmlDocument();
XmlElement批处理=doc.CreateElement(“批处理”);
batch.SetAttribute(“OnError”、“Continue”);
batch.SetAttribute(“ListVersion”、“1”);
batch.InnerXml=
"" +
“”+riskID+“”+
“+标题+”+
"";
尝试
{
//使用列表的GUID更新列表
listService.UpdateListItems(“2F6CA5F4-D78A-4716-B111-507917CF89E4”,批次);
}
捕获(例外情况除外)
{
thisXDocument.DOM.selectSingleNode(“//my:myFields/my:RiskStatement”).text=ex.Message;
}
}
上的文档:建议您使用用大括号括起来的列表GUID(即“{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()。我找到了问题的部分答案。当我将服务引用添加到我正在处理的子网站时,出于某种原因,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);
ListsService.Lists ListsService=new Risk_Form.ListsService.Lists();
listService.Credentials=System.Net.CredentialCache.DefaultCredentials;
xmlnodelist=null;
list=listService.GetListAndView(“风险”,“风险”);
字符串listID=list.ChildNodes[0]。属性[“名称”]。值;
字符串viewID=list.ChildNodes[1]。属性[“名称”]。值;
string riskID=thisXDocument.DOM.selectSingleNode(“//my:myFields/my:riskID”).text;
string headline=thisXDocument.DOM.selectSingleNode(“//my:myFields/my:RiskHeadline”).text;
XmlDocument doc=新的XmlDocument();
XmlElement批处理=doc.CreateElement(“批处理”);
batch.SetAttribute(“OnError”、“Continue”);
batch.SetAttribute(“ListVersion”、“1”);
batch.SetAttribute(“ViewName”,viewID);
batch.InnerXml=
"" +
“”+riskID+“”+
“+标题+”+
"";
XmlNode ret=listService.UpdateListItems(listID,batch);
Show(ret.OuterXml);
好的,我终于发现了这个愚蠢的错误。根Sharepoint网站上有一个列表,其显示名称与我试图在子网站上访问的列表相同。即使我的服务引用指向位于我的子网站上的列表web服务,它仍然返回了错误的列表。我在列表中使用了内部名称,现在可以使用了。还没有投票否决或投票关闭,但是。。。你忘了问一个问题了吗?是的,我也注意到了,但我尝试了带和不带,这似乎没有什么区别。当你执行一个查询时,如果where子句中的字段不在列表中,就会出现这个错误。我没有查询任何内容,但批处理XML中引用的字段都存在。此外,我还尝试了对GetListItems的类似调用,尝试访问列表中所有项目的RiskID字段,但得到了相同的错误。