提取 SharePoint 页面清单/XML






4.75/5 (5投票s)
将您的 SharePoint 页面的清单提取为 XML。使用此 XML 在 WSP 包中将此页面作为模块元素进行部署。
引言
本文解释了一个自定义包,该包允许获取 SharePoint 页面的元素 XML。该包在一些有代表性的位置添加了一些自定义功能区按钮,允许开发人员获取页面的元素定义。此 XML 中的元素定义可以使用 SharePoint 模块功能进行打包,以便在同一场或未来的场中配置该页面。
背景
为了理解该包相对于一个页面会获取什么,我们首先需要理解我所说的 SharePoint 页面的元素定义是什么意思。在传统意义上,当开发人员开发 SharePoint 页面时(假设在开发环境中),需要找到一种方法来打包它,以便部署到任何更高级的环境,如测试或生产。为了实现这一点,有许多方法,例如:
- 从 SharePoint 页面库下载页面,并将页面上的所有 Web 部件导出为 .webpart 或 .dwp 文件。然后,将页面上传到目标环境,并将所有 Web 部件从导出的文件中导入到正确的 Web 部件区域。
- 编写功能事件处理程序,使用 SharePoint 服务器对象模型 (SSOM) 代码来配置页面(并添加 Web 部件)。使用功能,编写一个模块元素,以便在任何后续环境中创建页面,以及页面上的所有 Web 部件。
为了本文的目的,我们对第三种选项感兴趣。要理解什么是模块元素,以及它如何配置 SharePoint 服务器上的文件或页面,以下是一些我建议您首先参考的资料;
http://blog.mastykarz.nl/provisioning-publishing-pages-features-declarative-markup/ http://msdn.microsoft.com/en-us/library/office/ms434127(v=office.15).aspx
模块的原始定义是:模块是 SharePoint 解决方案中文件的容器。解决方案部署时,模块中的文件将被复制到 SharePoint 服务器上的指定文件夹中。简而言之,一个用于在页面库中配置 aspx 页面的模块需要一个模块元素定义,其中包含页面在 SharePoint 页面库中的元数据以及页面上的 Web 部件。它还需要一个物理 .aspx 文件来部署到页面库。
使用解决方案
部署后,您需要激活“页面清单提取器”功能,这是一个 Web 范围的功能。如前所述,此功能会在“开发人员”组下的 SharePoint 功能区添加一些功能区按钮。这些特定放置的功能区按钮位于
- 提取清单:Wiki 页面的页面选项卡(图片:下方 Wiki 页面按钮)
- 所有清单:页面库或页面库选项卡(图片:下方页面库按钮)
提取清单
如上图所示的“提取清单”按钮会提取当前 Wiki 页面的功能清单。单击此按钮将打开一个 SharePoint 模态弹出窗口,该窗口指向一个应用程序页面,其 URL 为“http://<your-siteurl>/_layouts/15/PageManifestExtractor/PageManifest.aspx”。此应用程序页面在 Wiki 页面上下文中接受一个查询字符串参数PageUrl,该参数可以是 Wiki 页面的完整 URL 或服务器相对 URL,换句话说,就是需要提取清单的页面的 URL。
因此,例如,如果您想获取顶级站点集合上 URL 为“http://contoso.com/pages/WikiPage.aspx" 的页面的页面清单,则模态弹出窗口将打开的页面 URL 如下:
http://contoso.com/_layouts/15/PageManifestExtractor/PageManifest.aspx?PageUrl=/pages/WikiPage.aspx
同样,要从 URL 为“http://contoso.com/mySite/Pages/WikiPage.aspx" 的 SharePoint 子网站提取页面清单,模态弹出窗口的页面 URL 将如下所示:
http://contoso.com/mysite/_layouts/15/PageManifestExtractor/PageManifest.aspx?PageUrl=/mysite/pages/WikiPage.aspx.
注意:上述 PageUrl 查询字符串中的页面 URL 可以是服务器相对 URL(如示例所示),也可以是完整 URL,如下所示:
http://contoso.com/_layouts/15/PageManifestExtractor/PageManifest.aspx?PageUrl=http://contoso.com/pages/WikiPage.aspx
单击功能区按钮时打开的模态弹出窗口在两个选项卡中显示文本:即“清单”和“内容”。默认选择“清单”选项卡。
“清单”选项卡提供了页面的元素定义,即使用 Module 标签通过 SharePoint 功能创建页面。此 Module 标签本质上包含两部分:一部分是页面的元数据,它被归属为页面库中页面的项;另一部分是页面上的所有 Web 部件,以及 Web 部件区域、区域索引和 Web 部件属性的详细信息。此元素标签现在可以复制并粘贴到功能元素文件中,从而可用于在任何其他环境中创建此页面。
另一个选项卡包含 aspx 文件的内容。对于大多数 Wiki 页面来说,内容是相同的,主要是因为它们是共享页面。通常,在这些页面上,变化的主要是 Web 部件,而这些 Web 部件的信息并没有嵌入到特定页面的实际 aspx 文件中。它们而是从内容数据库中获取的。但即便如此,配置此页面所需的功能元素实际上需要一个 aspx 文件作为占位符来部署到页面库。对于该 aspx 文件,可以将此选项卡中的内容复制并粘贴。
所有清单
页面库的库选项卡中的“所有清单”按钮以完全相同的方式打开一个模态弹出窗口,除了它指向的 URL。在这种情况下,URL 指向与之前相同的页面,但有一个不同的查询字符串参数,即在这种情况下,参数不是 PageUrl,而是 ListId,这是列表中上下文的 GUID。因此,本质上,如果一个页面库的 GUID 为“66769742-d599-448c-b5fc-3dbb18859141”,则 URL 的外观将是
http://contoso.com/mysite/_layouts/PageManifest/PageManifest.aspx?ListId={66769742-d599-448c-b5fc-3dbb18859141}
结果的弹出窗口以类似的方式获取清单 XML,只不过这次它获取的是库中所有页面的清单,包括库中任何文件夹中的页面。清单选项卡将提供一个单一的 Module 节点,其中包含页面库中每个页面的多个 File 节点。内容选项卡还将提供所有页面的页面内容,这些内容将用分隔线分隔,如下面的屏幕截图所示。
用例
如前所述,该工具主要是一个开发人员级别的工具。它主要用于开发人员完成页面开发并需要将其打包以部署到任何后续环境的场景。
另一方面,它也可以用于可能发生变化的情况,例如在生产等更高级环境中进行了更改,并且需要将其复制到更低级环境。现在,而不是逐个更改地重做所有更改,该工具可以用于获取页面 XML,打包然后将其重新部署到更低级环境。
日志记录
解决方案包在尝试获取不同工件时,会根据不同的级别实现日志记录。
Web 部件:在最低级别,解决方案会尝试获取页面上所有 Web 部件的列表,如果这样做时出现任何未处理的异常,则消息会记录在清单定义中,即在模态弹出窗口本身。此类异常的示例可以在下面的屏幕截图中看到;
页面级别:在工具尝试获取多个页面的清单信息的场景中,如果其中一个页面发生异常,则会在模态弹出窗口的顶部以红色突出显示。其他所有页面的定义(没有异常的)仍然可以在模态弹出窗口中获得并且可用。消息是通用消息,实际记录的异常可以通过日志消息中提到的 GUID 在 SharePoint 日志中查看。
严重:这是最高级别的异常,工具无法继续进行。这会以红色显示在模态弹出窗口的顶部。消息是通用消息,实际记录的异常可以通过日志消息中提到的 GUID 在 SharePoint 日志中查看。
使用工具时最常见的异常之一,并且一直无法避免的是,Web 部件被设置为不可导出。也就是说,每个 Web 部件都有一个安全设置,根据该设置,可以导出 Web 部件信息或不允许导出。此安全设置可以在下面的屏幕截图中看到。因此,对于使用该工具获取页面信息的任何开发人员的建议是,将所有 Web 部件的导出设置设置为 true。否则,在尝试获取任何 Web 部件定义时会显示异常,如上图“Web 部件错误”所示。
未来
如前所述,该工具是使用 SharePoint 服务器端对象模型代码开发的,该代码使用提升的权限和应用程序页面,因此此包不能作为沙盒解决方案部署。但是,由于这是一个开发人员工具,我曾有强烈的决心使用客户端对象模型开发此工具,但由于沙盒解决方案在布局/应用程序页面方面的限制而未能实现。但在即将进行的增强功能中,首要的改进措施将是将其重做为沙盒解决方案。
包
此工具的代码和 WSP 包均已上传到 CodePlex