You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 11:45:07