在启用浏览器的表单中向Sharepoint列表提交重复InfoPath表

本文关键字:提交 列表 InfoPath Sharepoint 浏览器 启用 表单 | 更新日期: 2023-09-27 18:10:12

希望你能帮上忙。我正在开发一个浏览器支持的InfoPath 2010表单,它位于SharePoint网站的文档库中(2007年和2010年)。在此表单中,有一个重复表,其中包含需要捕获的数据以用于报告目的。我选择的解决方案是使用内置的SharePoint列表。asmx Web Service将重复表中的行写入同一个SharePoint站点的单独列表中,该列表位于同一个站点集合中。我使用这里的步骤http://msdn.microsoft.com/en-us/library/cc162745(v=office.12).aspx作为基准。

我已经得到了一切设置和工作时,直接从InfoPath表单客户端站点运行。表单打开后,在提交时,重复表中的行被写入SharePoint列表,没有任何问题。然而,一旦我通过Central Admin和test部署表单,重复表中的任何一行都不会写入列表。没有任何错误或任何东西表明代码有问题,并且用于指示一行是否已上传的布尔字段被设置为true。

我的第一个想法是某个地方的权限有问题。也许当服务从客户端调用时,它传递我的凭据,但当从服务器通过文档库运行时,它使用不同的东西?它不应该使用用于访问SharePoint的凭据(这也是我的AD凭据)吗?是否有方法在调用列表时指定当前用户AD凭据的使用。Asmx web服务中的代码?

不管怎么说,我真的不知道还能去哪里。我所做的任何搜索都得到了相同的两个文档提交到SharePoint列表。任何帮助都将非常感激。下面是我用来完成这个任务的代码:

if (MainDataSource.CreateNavigator().SelectSingleNode("/my:myFields/my:ShippingInformation/my:ShipDate", NamespaceManager).Value != "")
            {
                // If Ship Date is not blank, upload items in Material used to SP List where ForQuote is False
                // Quote Number, RMA Number, Ship Date, Unit S/N,
                // Create a WebServiceConnection object for submitting 
                // to the Lists Web service data connection.
                WebServiceConnection wsSubmit =
                   (WebServiceConnection)this.DataConnections["Material Web Service Submit"];
                //Create XPathNodeIterator object for the new Material Lines
                XPathNodeIterator MaterialLines = this.MainDataSource.CreateNavigator().Select("/my:myFields/my:RepairQuote/my:QuoteLines/my:QuoteLine", NamespaceManager);
                int lineCount = 0;
                foreach (XPathNavigator NewLines in MaterialLines)
                {
                    lineCount += 1;
                    if (NewLines.SelectSingleNode(".//my:ForQuote", NamespaceManager).Value == "false" && NewLines.SelectSingleNode(".//my:LineSubmitted", NamespaceManager).Value == "false")
                    {
                        // Set the values in the Add List Item Template 
                        // XML file using the values in the new row.
                        DataSources["AddListItemTemplate"].CreateNavigator().SelectSingleNode("/Batch/Method/Field[@Name='Title']", NamespaceManager).SetValue(NewLines.SelectSingleNode(".//my:lineItem", NamespaceManager).Value);
                        DataSources["AddListItemTemplate"].CreateNavigator().SelectSingleNode("/Batch/Method/Field[@Name='RMANumber']", NamespaceManager).SetValue(MainDataSource.CreateNavigator().SelectSingleNode("./my:myFields/my:EntitlementContainer/my:RMANumber", NamespaceManager).Value);
                        DataSources["AddListItemTemplate"].CreateNavigator().SelectSingleNode("/Batch/Method/Field[@Name='UnitSerialNumber']", NamespaceManager).SetValue(MainDataSource.CreateNavigator().SelectSingleNode("./my:myFields/my:EntitlementContainer/my:serialNumber", NamespaceManager).Value);
                        DataSources["AddListItemTemplate"].CreateNavigator().SelectSingleNode("/Batch/Method/Field[@Name='ShipDate']", NamespaceManager).SetValue(MainDataSource.CreateNavigator().SelectSingleNode("./my:myFields/my:ShippingInformation/my:ShipDate", NamespaceManager).Value);
                        DataSources["AddListItemTemplate"].CreateNavigator().SelectSingleNode("/Batch/Method/Field[@Name='OrderType']", NamespaceManager).SetValue(MainDataSource.CreateNavigator().SelectSingleNode("./my:myFields/my:RepairQuote/my:orderType", NamespaceManager).Value);
                        DataSources["AddListItemTemplate"].CreateNavigator().SelectSingleNode("/Batch/Method/Field[@Name='QuoteNumber']", NamespaceManager).SetValue(MainDataSource.CreateNavigator().SelectSingleNode("./my:myFields/my:RepairQuote/my:quoteNumber", NamespaceManager).Value);
                        DataSources["AddListItemTemplate"].CreateNavigator().SelectSingleNode("/Batch/Method/Field[@Name='LineQuantity']", NamespaceManager).SetValue(NewLines.SelectSingleNode(".//my:lineQuantity", NamespaceManager).Value);
                        DataSources["AddListItemTemplate"].CreateNavigator().SelectSingleNode("/Batch/Method/Field[@Name='LineNumber']", NamespaceManager).SetValue(lineCount.ToString());
                        // Set the value of Cmd attribute to "New".
                        DataSources["AddListItemTemplate"].CreateNavigator().SelectSingleNode("/Batch/Method/@Cmd", NamespaceManager).SetValue("New");
                        // Submit the new row.
                        wsSubmit.Execute();
                        NewLines.SelectSingleNode(".//my:LineSubmitted", NamespaceManager).SetValue("true");
                    }
                }
            }

在启用浏览器的表单中向Sharepoint列表提交重复InfoPath表

我不确定为什么当您在代码中部署和调用列表web服务时代码不工作。但是,我建议您尝试调试它以找到问题的根源:

一步步调试在SharePoint 2010上部署的InfoPath 2010表单使用Visual Studio 2010

请尝试一下,并逐步通过它,看看它是否通过预期的代码。

嗯,我不确定这是否是答案本身,但我相信这个问题与网站的安全性有关。我通过使用SharePoint对象模型而不是web服务来创建列表项来解决这个问题(参见http://www.bizsupportonline.net/browserforms/how-to-use-sharepoint-object-model-submit-data-infopath-browser-form-sharepoint-list.htm)。在SharePoint对象模型中,我可以使用AllowUnsafeUpdates。此外,我花了相当多的时间来设置web服务,包括数据连接,CAML文件等。然而,这种方法只花了几分钟。吸取的教训是,尽可能使用SharePoint对象模型。

foreach (XPathNavigator NewLines in MaterialLines)
                {
                    lineCount += 1;
                    if (NewLines.SelectSingleNode(".//my:ForQuote", NamespaceManager).Value == "false" && NewLines.SelectSingleNode(".//my:LineSubmitted", NamespaceManager).Value == "false")
                    {
                        using (SPSite site = SPContext.Current.Site)
                        {
                            if (site != null)
                            {
                                using (SPWeb web = site.OpenWeb())
                                {
                                    // Turn on AllowUnsafeUpdates on the site
                                    web.AllowUnsafeUpdates = true;
                                    // Update the SharePoint list based on the values
                                    // from the InfoPath form
                                    SPList list = web.GetList("/Lists/InfoPathRtpItems");
                                    if (list != null)
                                    {
                                        SPListItem item = list.Items.Add();
                                        item["Title"] = NewLines.SelectSingleNode(".//my:lineItem", NamespaceManager).Value;
                                        item["RMANumber"] = MainDataSource.CreateNavigator().SelectSingleNode("./my:myFields/my:EntitlementContainer/my:RMANumber", NamespaceManager).Value;
                                        item["UnitSerialNumber"] = MainDataSource.CreateNavigator().SelectSingleNode("./my:myFields/my:EntitlementContainer/my:serialNumber", NamespaceManager).Value;
                                        item["ShipDate"] = MainDataSource.CreateNavigator().SelectSingleNode("./my:myFields/my:ShippingInformation/my:ShipDate", NamespaceManager).Value;
                                        item["OrderType"] = MainDataSource.CreateNavigator().SelectSingleNode("./my:myFields/my:RepairQuote/my:orderType", NamespaceManager).Value;
                                        item["QuoteNumber"] = MainDataSource.CreateNavigator().SelectSingleNode("./my:myFields/my:RepairQuote/my:quoteNumber", NamespaceManager).Value;
                                        item["LineQuantity"] = NewLines.SelectSingleNode(".//my:lineQuantity", NamespaceManager).Value;
                                        item["LineNumber"] = lineCount.ToString();
                                        item.Update();
                                    }
                                    // Turn off AllowUnsafeUpdates on the site
                                    web.AllowUnsafeUpdates = false;
                                    // Close the connection to the site
                                    web.Close();
                                }
                                // Close the connection to the site collection
                                site.Close();
                            }
                        }
                    }