如何基于Dataverse角色与字段状态控制模型驱动应用Edit按钮显隐
模型驱动应用Edit按钮禁用逻辑实现方案
关于Ribbon Workbench的说明
Ribbon Workbench完全支持你要的这种条件逻辑,而且是修改模型驱动应用命令栏的主流工具,比直接手写JavaScript和XML更直观,建议优先用它来关联自定义逻辑,不用纠结纯手动配置。
JavaScript实现的入门步骤
1. 确认字段的逻辑名称
Dataverse所有API操作都依赖字段逻辑名称(不是显示名),查看方式:
- 打开对应Dataverse表,进入「字段」列表
- 找到状态字段,查看「逻辑名称」列(比如系统默认状态字段是
statuscode,自定义字段可能是new_status这类格式) - 也可以在解决方案中打开该字段,在详情页顶部直接看到逻辑名称
2. 编写核心JavaScript函数
需要写一个返回Promise<boolean>的函数,因为涉及异步查询用户角色/团队,示例框架如下:
function shouldDisableEditButton() { return new Promise((resolve) => { // 1. 获取当前记录的状态值 const statusAttr = Xrm.Page.getAttribute("你的状态字段逻辑名"); // 这里根据实际情况选:用getText()匹配显示值,或getValue()匹配选项集数值 const isCompleted = statusAttr && statusAttr.getText() === "完成"; if (!isCompleted) { resolve(false); // 状态未完成,启用按钮 return; } // 2. 查询当前用户关联的目标团队与角色 const userId = Xrm.Page.context.getUserId().replace(/[{}]/g, ""); // FetchXml:查询用户所属的、包含目标角色的特定团队 const fetchXml = ` <fetch> <entity name="role"> <attribute name="name" /> <link-entity name="teamroles" from="roleid" to="roleid" intersect="true"> <link-entity name="team" from="teamid" to="teamid" alias="team" filter="team/teamname eq '你的特定团队名称'"></link-entity> </link-entity> <link-entity name="systemuserroles" from="roleid" to="roleid" intersect="true"> <link-entity name="systemuser" from="systemuserid" to="systemuserid" alias="user" filter="user/systemuserid eq ${userId}"></link-entity> </link-entity> </entity> </fetch> `; Xrm.WebApi.retrieveMultipleRecords("role", `?fetchXml=${encodeURIComponent(fetchXml)}`).then((result) => { // 3. 检查是否包含目标角色 const hasTargetRole = result.entities.some(role => role.name === "你的特定角色名称"); // 状态完成且符合角色/团队条件时,返回true(禁用按钮) resolve(isCompleted && hasTargetRole); }).catch(() => { resolve(false); // 查询失败时默认启用按钮,避免影响正常操作 }); }); }
3. 上传并关联Web资源
- 把上述代码保存为
.js文件,在Dataverse解决方案中上传为Web资源 - 用Ribbon Workbench打开你的模型驱动应用,找到Edit按钮的「Enable Rule」
- 添加「Custom Rule」,关联你上传的Web资源和
shouldDisableEditButton函数 - 注意:Ribbon Workbench的Enable Rule逻辑是「返回true则启用按钮」,所以如果你的函数返回true表示要禁用,需要调整规则的判断逻辑,或者在函数中返回相反值(比如
resolve(!(isCompleted && hasTargetRole)))
关键注意点
- 建议用角色/团队的ID代替名称写判断逻辑,避免名称修改导致逻辑失效(把fetchXml中的
teamname eq 'xxx'换成teamid eq 'xxx',角色同理) - 测试时切换不同用户、角色、记录状态,确保逻辑覆盖所有场景
- 统一界面(Unified Interface)下优先使用
Xrm.WebApi,避免旧API的兼容问题
内容的提问来源于stack exchange,提问作者naijacoder
相关产品推荐
相关产品推荐

