0

我有一个带有自定义提交代码的 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;
        }
    }
4

4 回答 4

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

然后,您可以使用 listGuid 和批处理调用 UpdateListItems()。

于 2009-07-30T19:09:07.117 回答
1

好的,我终于弄清楚了这个愚蠢的错误。根 Sharepoint 站点上有一个列表,其显示名称与我尝试在子站点上访问的列表相同。即使我的服务引用指向位于我的子站点上的 Lists Web 服务,它仍然返回错误的列表。我为我的列表使用了内部名称,现在它可以工作了。

于 2009-07-31T15:41:01.963 回答
0

来自MSDN上的文档:建议您使用用大括号括起来的列表 GUID(即“{GUID}”),但您也可以使用列表显示名称。

您的通话中似乎缺少那些花括号。

于 2009-07-30T18:46:46.383 回答
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);
于 2009-07-30T20:04:33.573 回答