修复沙盒解决方案中的 InfoPath 表单
使用具有隐藏代码的 InfoPath 表单时,表单依赖于基于代码的沙盒解决方案来执行隐藏代码。 本文可帮助你修复或转换 InfoPath 表单,以便使它们不再依赖于沙盒解决方案。
注意
基于代码的沙盒解决方案在 2014 年被弃用,而 SharePoint Online 开启了完全移除此功能的过程。 基于代码的沙盒解决方案在 SharePoint 2013 和 SharePoint 2016 中也同样被弃用。
分析你的 InfoPath 表单
在此部分中,我们介绍了可用于分析并修复 InfoPath 表单的模型。 根据表单,你可以修复表单并将其重新部署,或者你可能需要放弃使用 InfoPath,并使用替代方法来实现所需功能。
在采取任何操作之前,请务必评估对表单的业务需求。 我们通常会发现很多表单已不再符合业务需求,在这种情况下,直接放弃表单可能会更容易一些。
确定 InfoPath 表单是否使用隐藏代码
为此,我们建议使用 SharePoint 沙盒解决方案扫描程序工具。 此工具中的报告会指出沙盒解决方案是否来自 InfoPath 文件。 该工具还会显示解决方案中使用的程序集是否如本文中稍后介绍的毫无用处。
确定表单是否仍然相关
在开始修复/转换工作之前,请务必确定表单对于你的业务是否仍然重要。 如果是,请继续阅读下一节,否则,请考虑使用此表单所创建的数据。
通常,数据创建为 InfoPath XML 文件,位于 SharePoint 列表中。 如果移除表单,你将无法再可视化数据。 有时这是可以的,因为表单和数据不再相关。 但是,如果想要访问数据,可以将来自 InfoPath XML 文件的数据转换为 SharePoint 列表项目数据。 若要执行此操作,请参阅 PnP 转换 EmpRegConsole 控制台应用程序。
下载 InfoPath 表单(XSN 文件)以供检查
如果已确认你有需要处理的 InfoPath 表单,必须下载这些表单。 具有隐藏代码的 InfoPath 表单作为表单库或网站内容类型进行部署。
表单库
在这种情况下,XSN 文件位于 InfoPath 表单所部署到的表单库的表单文件夹内。 若要了解表单库,请查看遵循此约定的 WSP 包名称:InfoPath Form_LibName_id
。
在了解表单库后,需要从库的“表单”文件夹下载 template.xsn 文件。 为此,可以构造如下所示的 URL、 库 URL + /Forms/template.xsn (例如: https://contoso.sharepoint.com/sites/infopath1/IHaveCodeBehind/Forms/template.xsn
) ,并使用浏览器下载文件。
网站内容类型
作为内容类型部署的 InfoPath 表单的确拥有存储在表单库中的 XSN 文件,且将在表单部署时连接至内容类型。 如上一节所述,可以从 WSP 包名称获取库名称。 不同之处在于,表单实际上作为文件存储在库中,因此只需从表单库下载即可。
修复 InfoPath 表单
前面的章节已经介绍了具有隐藏代码的 InfoPath 表单,但是它们是否包含有用的隐藏代码呢? 在许多表单中,表单作者意外选择了 InfoPath“开发人员”功能区上的“代码编辑器”按钮。
如果你这样做了,可能会有不执行任何操作的隐藏代码。 移除之后,可以将通过具有隐藏代码的 InfoPath 表单转换为与没有隐藏代码且依赖于沙盒解决方案的 InfoPath 表单。
确定窗体的隐藏代码是否无用
SharePoint 沙盒解决方案扫描程序会告诉你 InfoPath 表单是否具有无用代码。 但是,你可能想知道如何区分无用隐藏代码和必要隐藏代码,因为你只能修复无用代码。 如果你仍然具有原始表单(而非在前面的步骤中下载的表单),只需扫视一下代码即可。
下面是默认空代码,如果有类似代码,可以通过删除代码来修复表单。
using Microsoft.Office.InfoPath;
using System;
using System.Xml;
using System.Xml.XPath;
namespace Form1
{
public partial class FormCode
{
// Member variables are not supported in browser-enabled forms.
// Instead, write and read these values from the FormState
// dictionary using code such as the following:
//
// private object _memberVariable
// {
// get
// {
// return FormState["_memberVariable"];
// }
// set
// {
// FormState["_memberVariable"] = value;
// }
// }
// NOTE: The following procedure is required by Microsoft InfoPath.
// It can be modified using Microsoft InfoPath.
public void InternalStartup()
{
}
}
}
如果你仅有从前面的步骤中下载的 XSN 文件,则可以将 XSN 文件重命名为 cab 文件(例如 template.cab)、提取程序集并使用 .NET 反射工具(例如 ILSpy 开源 .NET 程序集浏览器和反编译程序)以检查代码。
无用的隐藏代码的典型视图在 ILSpy 中如下图所示:
将隐藏的代码从 InfoPath 表单删除以将其修复
如果已确认隐藏代码毫无用处,可以通过执行下列操作将其删除:
打开“InfoPath 设计器”中的表单(右键单击“设计”)。
转到“文件”>“信息”>“表单选项”。
选择“编程”类别,然后选择“删除代码”。
在“文件”>“信息”>“快速发布”中再次发布表单。
通过“网站设置”>“解决方案”停用链接的沙盒解决方案
确认表单按预期方式运行。
删除沙盒解决方案。
注意
如果你不再具有对 InfoPath XSN 文件和源代码代码的访问权限,仍然可以通过停用具有无用代码的沙盒解决方案来修复这些表单。 请仅对沙盒解决方案报告输出 IsEmptyInfoPathAssembly = true 中提到的内容执行此操作。
迁移 InfoPath 表单
如果前面章节中的指南对你的 InfoPath 表单不适用,这意味着你的表单仍与业务相关,且包含不能删除的后置代码。 如果是这种情况,典型的解决方案是放弃使用 InfoPath,这可通过以下方法实现:
生成利用远程 API 读/写 SharePoint 数据的 SharePoint 外接程序。
通过使用 Azure PowerApps 或 Microsoft Flow 创建应用。
生成替换 InfoPath 表单的 SharePoint 外接程序
如果你选择使用 SharePoint 外接程序来替换 InfoPath 表单,有多种选项。 以下是三个选项;但是,可以使用这些选项的变体。
常见的 InfoPath 编码模式
为了更好地帮助你转换 InfoPath 表单,我们列出了 11 种常见的 InfoPath 编码模式,并介绍了如何使用三种 SharePoint 外接程序选项来实现这些模式。
为此,我们首先开发了使用最常见 InfoPath 编码模式的引用 InfoPath 表单,然后我们将该表单迁移到了三种首选 SharePoint 外接程序。
以下链接介绍了这些常见模式:
- 加载表单时填充字段 - 设置用户信息
- 加载表单时填充字段 - 读取列表信息
- 加载表单时填充字段 - 读取列表数据
- 通过代码提交表单
- 表单提交后切换视图
- 检索用户数据
- 读取数据集和设置多个控件
- 级联数据加载
- 上载或删除附件
- 添加或删除网站组用户
- 加载表单中的现有项
迁移 InfoPath 数据
将 InfoPath 表单移动到新解决方案后,你可能还想将你的数据从 InfoPath XML 迁移到常规 SharePoint 列表数据或你选择的数据层。 因为 InfoPath 文件是 XML 文件,所以读取和转换非常简单。
若要执行此操作,请使用 PnP 转换 EmpRegConsole 控制台应用程序。
打开现有表单
一旦禁用基于代码的操作,代码将不再在沙箱中运行。 因此,如果你有执行代码的表单,打开现有表单将不再起作用。
以下步骤可帮助你解决问题:
如果已经将 InfoPath 表单迁移到新解决方案,则你很可能已经转换了数据,如果是这样,表示你执行了正确的操作。
如果你选择按原样保存表单(例如由于它不再与业务相关),但仍想打开现有表单,则你可以执行以下步骤之一︰
从表单中移除隐藏代码并重新发布(请参阅将隐藏代码从 InfoPath 表单中删除以将其修复部分)。
使用 InfoPath 客户端打开表单。
将表单数据迁移到 SharePoint 列表数据(请参阅迁移你的 InfoPath 数据部分)。