一个用了5年Procreate的产品经理,突然在Power Pages里找到了画板的新用途。这不是转行做设计,而是微软的低代码平台终于让前端开发者能喘口气了——用Liquid模板语言直接操作数据库查询,还能把查询结果封装成JSON供其他组件调用。
听起来像给老虎插上翅膀?但翅膀怎么装,微软的文档写得像密码本。本文用一套书籍追踪应用的仪表盘案例,拆解FetchXML在Power Pages里的真实玩法。
为什么SPFx开发者会盯上Power Pages
SharePoint Framework(SPFx,SharePoint框架扩展)的开发者有个职业病:看到任何能写代码的微软平台都想试试深浅。Power Pages的前身是Power Apps portals,主打企业外部门户,但直到Web Templates(网页模板)功能成熟,才真正有了让开发者动手的空间。
核心差异在于数据层。SPFx调用的是SharePoint REST API,而Power Pages直接对接Dataverse(微软云数据库服务)。后者意味着你可以用FetchXML——一种微软用了十几年的查询语言——直接操作业务数据,不用写一行C#或JavaScript。
但这里有个坑:Power Pages的Liquid实现不是标准版,是微软的裁剪版。你能用的标签、能访问的对象、能执行的逻辑,全被框在一个小院子里。
从草图到数据库:一个仪表盘的三层结构
案例目标很明确:给书籍追踪应用做分析卡片。每张卡片显示一个统计数字——已读、在读、想读——带颜色区分和图标。
数据库设计走极简路线。User Book Status(用户书籍状态)表是核心,关联用户和书籍,用状态字段标记阅读进度。前端不需要知道书籍详情,只需要计数。
这种设计故意牺牲了灵活性,换取查询效率。FetchXML的aggregate(聚合)功能在这里派上用场,直接在数据库层做count(计数),而不是把数据拉到前端再算。
作者用Procreate画了线框图,5年前的许可证终于回本。草图里的卡片布局——大数字、副标题、彩色背景——直接映射到最终的Web Template结构。
权限:FetchXML返回空数据的头号元凶
进入代码之前,必须先处理Table Permissions(表权限)。这是Power Pages的安全闸门:即使你在环境里拥有最高权限,Web Template里的FetchXML查询也会返回空结果,如果对应表没有开放权限。
配置路径是Power Pages Management → Table Permissions。需要指定表名、权限范围(全局/账户/联系人层级)、以及哪些Web角色可以访问。这一步没有UI提示,漏掉就是白屏。
权限设计反映了Power Pages的产品定位:企业外部门户,面向匿名或受限用户。和内部系统的"默认信任"逻辑相反,这里默认拒绝,逐项开放。
Liquid + FetchXML:参数传递的四种姿势
Web Template的核心是一段Liquid代码,包裹FetchXML查询。先看基础版本:
代码做了三件事:定义变量默认值(status_value和color),执行fetchxml查询块,在entity(实体)节点里指定聚合计算。adrbp_userbookstatusid字段被标记为count聚合,输出别名是bookcount。
过滤条件用Liquid变量注入:status_value来自模板参数,user.id是当前登录用户的系统ID。这种写法把查询结构和业务逻辑混在一起,是Power Pages的妥协方案——不够优雅,但能用。
参数传递在include(包含)标签里完成。调用方指定状态码、标题、副标题、颜色和图标,模板内部统一处理。这意味着同一个模板可以渲染多种卡片,只换参数不换代码。
进阶玩法是条件逻辑。FetchXML本身不支持动态条件构造,但Liquid的if(如果)标签可以控制XML片段的输出。比如实现"可选过滤":
这里有个反直觉的细节:如果变量用| default:(默认值过滤器)赋了初值,它永远不会"空",if检查永远为真。要让它生效,必须去掉默认值,让调用方显式传参。
更复杂的场景需要分支逻辑。比如按filter_type(过滤类型)参数选择不同的condition(条件):
这种写法把XML当成字符串模板来拼装,可读性堪忧,但在Power Pages的约束下是唯一选择。开发者需要自行保证生成的XML合法,没有语法检查,出错就是运行时崩溃。
JSON输出:让模板变成API端点
Web Template的隐藏技能是修改MIME type(媒体类型)。默认输出HTML,改成application/json后,它就变成一个数据接口。
配合Liquid的json过滤器,可以把查询结果序列化输出。前端组件——无论是React、Vue还是原生JavaScript——都可以fetch这个端点,拿到纯数据。
这种模式模糊了前后端边界。Power Pages既是页面渲染器,又是轻量级API网关。对于已经用惯SPFx的开发者,这是熟悉的配方:微软平台+声明式配置+关键时刻允许逃遁到代码。
但限制同样明显。FetchXML的聚合功能有限,复杂计算需要多轮查询或移到前端。Liquid的执行环境沙箱化,不能调用外部服务或执行自定义逻辑。这些边界决定了Power Pages适合的场景:数据展示为主,业务逻辑轻量,用户量可控。
作者最后留下的问题是:如果你的仪表盘需要实时更新,是选择定时刷新整个页面,还是在Power Pages里找WebSocket的替代方案?微软的文档里没有答案,但社区里有人用JavaScript轮询JSON端点,有人干脆把数据同步到外部实时数据库。
这个缺口,或许就是下一个Procreate草图要解决的问题。
热门跟贴