2013年8月21日,星期三

在SharePoint应用程序中使用Web部件

I’ve之前曾提到“you don’t get very much”当您开始创建包含一些SharePoint托管组件(例如页面)的应用时。您将获得一个基本的ASPX页面,然后从那里开始’取决于您作为开发人员。在玩应用程序的同时,我’我们发现通过将开箱即用的组件(例如SharePoint命名空间中的Web部件/控件)添加到应用页面来进行试验很有趣。结果非常有趣,并得出了一些发现,这些发现可能是工具箱中的有用技巧。如果没有别的,您可能会发现这很有趣“leftfield”发表关于您所没有的一些问题’t thought to ask.

在我们潜水之前,这里’s在我们整个应用程序系列中的位置:

  1. SharePoint 2013应用–架构,功能和UX注意事项
  2. 入门–在SharePoint应用程序中创建列表,内容类型,字段等(配置)
  3. 在应用程序网络中使用数据以及为什么要这样做
  4. 从SharePoint 2013应用访问最终用户数据(在宿主网站中)
  5. 将SharePoint 2013应用推广到企业-租户范围和PowerShell安装
  6. Azure是新的SharePoint‘_layouts’ directory
  7. “Host web 应用” –将文件(例如母版页)设置到主机网站
  8. “Host web 应用” –设置字段和内容类型
  9. 将SP2013提供程序托管的应用程序/远程事件接收器部署到Azure网站(用于Office 365应用程序) 
  10. 在SharePoint应用程序中使用Web部件[本文]

在应用程序中部署Web部件

如果创建SharePoint托管的应用程序,则可能会注意到您获得的默认页面是ASPX页面而不是HTML。此外,它在顶部有几个声明,允许使用SharePoint控件:

应用页面默认标记 

的idea here is that you might want your app to take advantage of some SharePoint building blocks (web parts/controls) rather than recreating that functionality from scratch. But since 你不’在应用程序中具有整页编辑模型(它’不是SharePoint内容 贡献者可以编辑的,毕竟),所有Web部件都必须(由开发人员)包含在页面的标记中。我进行了一些测试,以查看哪些Web部件似乎可以正常工作,而本文实际上是关于我的发现的。

我扩展了标记,以在Web部件区域中包括一些常见的Web部件(并添加了我开始需要的所有@Register指令)。我的标记是:

** N.B.我较新的代码示例未在RSS阅读器中显示- 点击这里查看全文 **

我(可能)可以在应用程序中使用哪些Web部件?

这里’我的结果摘要:

网页部分

可以用吗

内容查询Web部件 没有
内容搜索Web部件
XsltListView Web部件
核心搜索结果Web部件
Page Viewer Web部件
数据视图Web部件 没有
Result Script web part (for 搜索结果) 没有 编辑:是的

内容查询Web部件:

合格证似乎持平“no”. If 你不’在主机网络上未启用发布功能,您’ll get this:

合格证
这似乎与无法获取ContentQueryMain.xsl有关。我注意到它是401而不是404,这很有趣,但是无论如何,如果激活发布,就会得到:

合格证 2

因此,感觉“内容查询” Web部件可能没有受到任何关注,无法使其在应用程序Web上正常工作。它’值得注意的是,XSL的路径引用了应用程序网络(在我的情况下, //cob-387fbe6473fe0b.spapps.dev/Style%20Library/XSL%20Style%20Sheets/ContentQueryMain.xsl)– although it is “structurally”正确(因为样式库是从根引用的),我认为有效’s not possible to “browse”在应用程序网络域上托管网络内容。我什至尝试提供绝对 主机网站 XSL文件的网址,但是也会因‘page not found’ error.

因此,也许需要对CQWP进行重新设计才能使其在应用程序中运行。

内容搜索Web部件:

该Web部件似乎工作正常,这是个好消息:

内容搜索Web部件

It’值得一提的是,显示模板仍是从宿主网站(母版页库)中提取的,但是似乎没有问题。

XsltListView Web部件:

当我’在之前的文章中提到过’第一次将列表添加到正在开发的应用程序中时会有些混乱-默认情况下,’页面上没有任何内容(例如,指向列表的导航链接),它不会告诉您列表配置是否成功。但是,既然你’您将知道列表URL,然后在浏览器地址栏中键入地址以显示该URL。要显示列表中的项目,您可以’ll最有可能想要使用XsltListView– you’我们将需要手动将标记添加到您的页面之一。当你这样做的时候,你’将会看到在您的应用程序网络中显示列表中的项目效果很好:

列表视图Web部件

我想知道是否可以使用此Web部件显示列表中的项目 在主机网络中。抛开包括令牌之类的潜在问题,例如 〜现场 在URL中(通过使用硬编码的绝对URL进行测试),我发现它不是:

XsltListViewWebPart-宿主网站 

Page Viewer Web部件:

在应用程序中使用Page Viewer Web部件的想法可能非常有趣。我很想知道是否可以在我的应用程序中显示来自宿主网站的页面,但发现它带有警告(如下)。下图显示了–来自宿主网站的页面。一些要点:

  • 的“允许该页面为iframe”消息只是页面上的一些文本
  • 黄色“customized”消息是因为我在SPD中手动编辑了页面以添加<WebPartPages:AllowFraming ID ="AllowFraming" runat="server" />标签。如果这是由其他更高级别的东西(页面布局/母版页)提供的,则此消息将不存在

页面查看器Web部件

但主要的警告可能是,对于硬编码/绝对网址,它们都可以正常工作,但是诸如 〜现场 似乎不起作用。因此,在现实生活中,如果您需要在此处具有任何相对URL,则可能会遇到困难。仍然,也许有用。

结果脚本Web部件(搜索结果):

[2013年8月22日更新:Scot Hillier与我们取得联系,告诉我可以使用此Web部件。解决方案可以在本节的底部找到。]

[下面是原始文本,以显示您可能遇到的错误:]结果脚本Web部件实际上是现代的“search results”SharePoint 2013中的Web部件。可用于显示给定搜索查询的结果– it is the web part used on the default SP2013 搜索结果 page, and very powerful it is too. 好像这个 应该 在SharePoint托管的应用程序中工作,但我无法’t quite get there. I’m hoping I’我忽略了某些东西,实际上是有可能的,因为问题似乎只是在搜索查询中获得了正确的转义引号格式(DataProviderJSON属性)。我尝试了各种形式,但我要么看到以下内容:

结果脚本Web部件

..或这个:

结果脚本Web第2部分

我尝试的引号/转义字符的排列包括:

  • \”
  • ””
  • ..等等

更新–解决方案(感谢苏格兰人!):

  • 的answer is to use XHTML encoding of the quotation marks – i.e. &quot; 

当您这样做时,您’会看到结果脚本Web部件在您的应用程序中确实起作用:

结果脚本Web部件-工作

以便’好消息,这意味着我们可以在应用程序中利用此Web部件! 

This seems a shame, because I can imagine lots of 应用 which might want to display 搜索结果. For these 应用, a nice web part cannot be used –代码是必需的,例如我在 使用REST调用SharePoint搜索(例如从JavaScript或应用程序).

核心搜索结果网页部分:

尽管事实证明可以使用“结果脚本” Web部件,但是出于任何原因,’不适合您在那里的情况’始终是“核心搜索结果” Web部件–这是您从SharePoint早期版本中了解并喜欢的搜索结果Web部件。它使用XSL(而不是JavaScript显示模板)进行渲染,并且不会’没有复杂的查询生成器(您不会’则无法在应用程序中使用),但可以在页面上显示搜索结果很好:

核心搜索结果Web部件

结论

某些Web部件可以在应用程序内使用,而某些则不能。在其他类型的控件(例如SharePoint服务器控件)方面,我发现应用程序使用的web.config的SafeControl设置比常规设置更具限制性–几个名称空间和特定控件被标记为不安全,因此许多服务器控件在应用程序页面中将被禁止使用。还是’很有可能可以使用一些–这里将需要更多测试。

通常,通常应该适用于SharePoint应用程序的开发人员– check if there’框中的东西,可以在编写代码之前使用。那里的东西可能会节省您大量的精力。

下次-使用应用程序部件(ClientWebPart)将应用程序元素带入主机网络

8条评论:

匿名 said...

本文中“ manual”一词被使用了很多次,以至于我只能再次得出结论,Microsoft发布了一个没有一流开发工具集的SharePoint版本(在本例中为2013)。

当SharePoint 2007在Visual Studio 2005(当时用于自定义SP 2007的IDE)中以接近零的开发工具发布时,我们第一次看到了这个故事。

那不是’在Visual Studio 2012之前,SharePoint 2010可以使用全套工具(例如,内容类型向导)。

现在,我们逐篇阅读有关如何“almost”使用SharePoint 2013和Visual Studio 2012或2013 Preview来执行此操作“你在这里需要一个垫片,而在那边需要另一个螺栓”使其在生产环境中真正起作用。

我们什么时候可以从Microsoft获得适当的工具集来自定义SharePoint?我担心答案在两者之间“maybe” and “never”.

克里斯·奥'Brien说过...

@匿名,

我认为这取决于您的期望。如果您曾经为SAP,Salesforce等其他企业产品或FileNet等其他ECM平台开发过,'我知道SharePoint当然不会更糟。实际上,'可能好得多。

当然如果你'与在.NET或Java等较薄/较低级别的平台(坦率地说,活动部件较少)上进行开发相比,有时SharePoint确实感觉好像'更摩擦。但是那's因为通常有!我个人'm not sure it'期望其他任何事情都是现实的。

It'是一个复杂的平台,因此开发人员和用户有时总是希望探索一些稍微不合常规的方法(就像这篇文章一样)。但它'有助于识别此类情况-就本文而言'd say:

-没有人说您必须使用"apps"SharePoint中的框架
-微软唐'不能提供指导说明可以在其中使用Web部件-我认为这些东西纯粹是作为奖励,可以节省一些代码

你不同意吗?

克里斯。

拉尔夫说过...

出色而宝贵的探索工作!感谢您分享克里斯。

的Masked Power Platformer说过...

克里斯你好
很棒的文章。我发现在添加XsltListViewWebPart之后,"edit this list"链接无效,并返回JavaScript错误。可以通过在页面上添加对SP.UI.Dialog.js的脚本引用来解决此问题。希望这对某人有帮助。

斯瓦蒂·贾恩(Swati Jain)说过...

克里斯,你好

我非常喜欢这个帖子。
我有一个查询。XSLTList视图示例引用列表是AppWeb

如何使用HostWeb for XSLT列表视图WebPart中的OOB列表完成此操作

斯瓦蒂

克里斯·奥'Brien说过...

@Swati,

我有两个用于XsltListViewWebPart的示例,一个用于主机网络,一个用于应用程序网络。上面,我指出:

"我想知道是否可以使用此Web部件显示主机Web中列表中的项目。撇开在URL中包含〜site这样的令牌的潜在问题(通过对硬编码的绝对URL进行测试),我发现事实并非如此。"

所以我不'相信这是可能的。您'我们将需要编写一些代码(例如JSOM / REST)来从主机网络中提取项目,并自行显示。我的帖子 从SharePoint 2013应用访问最终用户数据(在宿主网站中) 可能有帮助。

干杯,

克里斯。

未知说过...

克里斯你好

感谢您的帖子。它确实为我们的SharePoint App开发提供了起点。

但是,有一个问题:是否可以管理XsltListViewWebPart(appweb版本)的权限?我的目标是显示一个列表,但我不希望用户编辑或添加项目。

感谢您的快速回答!

法比安

克里斯·奥'Brien说过...

@Fabian,

好吧,请考虑如果用户"contribute"对基础列表的权限,他们基本上将能够添加/编辑项目。并且由于应用程序中的列表是作为应用程序*的一部分提供的,因此情况就是如此。

HTH,

克里斯。