Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从.NET访问Sharepoint列表Web服务_C#_.net_Web Services_Sharepoint_Infopath - Fatal编程技术网

C# 从.NET访问Sharepoint列表Web服务

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

我有一个带有自定义提交代码的InfoPath表单,可通过调用Sharepoint列表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;
        }
    }
[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}”),但也可以使用列表显示名称

你的电话里好像少了那些花括号

有两件事:

  • 调用UpdateListItems()时,批处理中可能还需要默认视图ID

  • 您可以通过调用listService.GetListAndView()以编程方式获取列表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字段,但得到了相同的错误。