我想知道在SharePoint中提交表单时是否可以创建文件夹。我在Infopath中创建了一个自定义SharePoint列表表单,我想在提交按钮中添加一个操作,以创建四个文件夹,每个文件夹对应四个文档库,其中包含已提交项目的标题。
但是我看到在Infopath中没有为SharePoint列表启用自定义代码按钮,因此我无法在后台添加任何代码。开箱即用的工作流程也不允许我这样做,除非我遗漏了某些东西......还有什么方法可以做到这一点?
提前感谢您的帮助!!
答案 0 :(得分:0)
是的,你可以做到这一点,但是,它非常棘手。
理论上,您可以调用Lists.asmx Web服务的“UpdateListItems”方法并传递批处理语句,但由于列表Web服务的实现,您无法在InfoPath中使用它。这就是为什么你需要编写自己的Web服务来包装UpdateListItems方法,这样你就可以将它与IP一起使用。
如果您不知道如何编写Web服务(并在SharePoint中托管),请使用StackOverflow的搜索功能或考虑谷歌 - 许多很棒的教程; - )
运行Web服务后,您需要向http://myserver/_vti_bin/Lists.asmx Web服务添加服务引用,然后创建以下方法:
[WebMethod]
public void UpdateListItems(string listGuid, string xmlBatch)
{
var batch = new XmlDocument();
batch.LoadXml(xmlBatch);
//create an instance of the lists proxy client
var listSvc = listService = new ListsWebService.Lists();
//set the url of the client
listService.Url = "http://myserver/_vti_bin/Lists.asmx";
listSvc.UpdateListItems(listGuid, batch);
}
请注意,如果您将listSvc的Url配置为硬编码(如本例所示),则需要确保要添加文件夹的列表与Url位于同一站点内。如果你想让这个方法更通用(我建议你做),你可以简单地将SiteCollection Url作为参数传递,并将listSvc.Url设置为SiteCollectionUrl +“_ vti_bin / Lists.asmx”。
设置完成后,您可以在InfoPath中创建与新创建的Web服务的数据连接,并将其配置如下:
字段“listName”实际上是列表的GUID - 您可以通过单击“库设置” - “信息管理策略设置”通过UI获取它,然后从浏览器的地址栏复制它。例如:
{39d01277-4ba1-4589-90f8-c957b4b2dd09}
字段“XML”包含用于创建文件夹的批处理脚本。您可以静态声明它,或者在您的情况下,您可以使用concat()函数动态构建它。此示例在库的根目录中创建名为“MyFolder”的文件夹。
<Batch>
<Method ID='1' Cmd='New'>
<Field Name='ID'>New</Field>
<Field Name='FSObjType'>1</Field>
<Field Name='BaseName'>MyFolder</Field>
</Method>
</Batch>
如果您需要子文件夹,也可以这样做。以下示例将在“MyFolder”文件夹中创建名为“MySubFolder”的文件夹。
<Batch>
<Method ID='1' Cmd='New'>
<Field Name='ID'>New</Field>
<Field Name='FSObjType'>1</Field>
<Field Name='BaseName'>MyFolder/MySubFolder</Field>
</Method>
</Batch>
然后你只需添加一个提交按钮动作就可以了: - )
另请注意,上面的代码只是一个示例(虽然有效)。如果您在生产中使用它,请确保添加适当的异常日志记录,因为您将需要它: - )
希望这有帮助!