以编程方式将浏览器InfoPath表单保存到其源列表中

时间:2010-03-04 11:52:32

标签: c# sharepoint infopath

我在MOSS 2007上的表单库中有一个InfoPath表单。我认为InfoPath浏览器工具栏带有它的保存(手动输入文件名)并关闭相当复杂的填写表单的过程。我要做的只是让一个带有一些代码的按钮将表单保存到库中,并使用自动生成的文件名打开它并关闭回库。为此,我编写了以下代码:

public void SaveForm(string formXml, string fileName, Dictionary<string, string> extraColumns)
{
    SPFolder formsLibraryFolder = SPContext.Current.List.RootFolder;

    string lowerCaseFilename = fileName.ToLower();
    if (!lowerCaseFilename.EndsWith(".xml"))
        fileName += ".xml";

    web.AllowUnsafeUpdates = true;
    SPFile file = formsLibraryFolder.Files.Add(fileName, Encoding.UTF8.GetBytes(formXml));

    if ((extraColumns != null) && (extraColumns.Count > 0))
    {
        foreach (KeyValuePair<string, string> column in extraColumns)
        {
            file.Item[column.Key] = column.Value;
        }
        file.Item.Update();
    }

    web.AllowUnsafeUpdates = false;
}

事实证明,这个代码的问题是,在我想将表单保存到打开它的库的情况下,SPContext.Current.List为null。我明显错误地认为,因为表单将在浏览器内完成,列表的上下文才有效。 然而,我可以访问包含列表的SPWeb但这意味着我需要对每种类型的表单进行硬编码列表名称,当然事先知道每个表单的列表名称。这段代码是我在不同项目中以多种形式编写和引用的辅助库的一部分,所以我真的不能硬编码值。我当然可以将列表名称作为参数传递,并在表单中对列表名称进行硬编码,但这仍然意味着我必须事先知道将在何处部署表单。 有什么方法可以解决哪个库被点击以启动填写表单?

1 个答案:

答案 0 :(得分:3)

我已经想出了如何做到这一点,所以我会把它发给其他人。

当您关闭浏览器表单时,InfoPath会将您重定向回列表。您可以通过以下文章中的方法2获取列表的URL:

http://www.bizsupportonline.net/blog/2010/01/2-ways-retrieve-sharepoint-site-collection-infopath-browser-form/

点击我自己的保存按钮后,我将URL传递给我更新的保存功能。我应该指出这不是万无一失的代码,它可能会破坏一些地方。但它确实适用于我需要使用它的特定情况。

public void SaveForm(string formXml, string fileName, string url, Dictionary<string, string> extraColumns)
{
    SPWeb web = SPContext.Current.Web;
    string webUrl = web.Url;
    if (!webUrl.EndsWith("/"))
        webUrl += "/";

    string relativeUrl = url.Replace(webUrl, string.Empty);
    string listName = relativeUrl.Substring(0, relativeUrl.IndexOf('/'));
    SPList destinationList = web.Lists[listName];
    SPFolder destinationFolder = destinationList.RootFolder;

    string lowerCaseFilename = fileName.ToLower();
    if (!lowerCaseFilename.EndsWith(".xml"))
        fileName += ".xml";

    web.AllowUnsafeUpdates = true;
    SPFile file = destinationFolder.Files.Add(fileName, Encoding.UTF8.GetBytes(formXml));

    if ((extraColumns != null) && (extraColumns.Count > 0))
    {
        foreach (KeyValuePair<string, string> column in extraColumns)
        {
            file.Item[column.Key] = column.Value;
        }
        file.Item.Update();
    }

    web.AllowUnsafeUpdates = false;
}