原始 KB 编号: 4552163

确定隐藏按钮的原因

由于与按钮评估为 false 关联的 命令 上的 启用规则 显示规则 ,按钮可能会隐藏。 可能是关联的命令具有隐藏统一 Mscrm.HideOnModern 接口应用程序中按钮的显示规则。 还可能已创建 HideCustomAction ,该操作将强制隐藏按钮。 如果用户处于脱机状态,则不会显示自定义命令和没有 Mscrm.IsEntityAvailableForUserInMocaOffline 启用规则的默认命令。

  • 如果实体启用了“ 移动 版中只读”选项,则任何 PrivilegeType 值为以下其中一项的 EntityPrivilegeRule 类型的 显示规则 ( 创建 写入 删除 分配 共享 ) 都将计算为 false,这将强制实体仅允许 读取 权限。 在实体上启用 “移动版中只读” 标志时,一些最常见的默认系统规则的计算结果为 false 的示例如下,但不仅限于此列表 ( Mscrm.CreateSelectedEntityPermission 、、 Mscrm.CanWritePrimary Mscrm.DeleteSelectedEntityPermission Mscrm.AssignSelectedEntityPermission Mscrm.SharePrimaryPermission Mscrm.CanSavePrimary Mscrm.WritePrimaryEntityPermission Mscrm.ShareSelectedEntityPermission Mscrm.CanWriteSelected Mscrm.WriteSelectedEntityPermission Mscrm.CanDeletePrimary Mscrm.DeletePrimaryEntityPermission ) 。 可以编辑实体并取消选中“ 移动版中只读 ”选项,以允许这些规则的计算结果为 true,前提是该规则正在测试的权限也授予用户。
  • 不要从命令中删除 Mscrm.HideOnModern 显示规则,以强制按钮显示在统一接口中。 具有显示规则的 Mscrm.HideOnModern 命令适用于旧版 Web 客户端接口,在统一接口中不受支持,并且可能无法正常工作。
  • 应用内工具命令检查器将用于检查功能区组件定义,以帮助我们确定隐藏按钮的原因。

    若要启用命令检查器工具,必须将参数 &ribbondebug=true 追加到 Dynamics 365 应用程序 URL。 例如: https://yourorgname.crm.dynamics.com/main.aspx?appid=<ID>&ribbondebug=true

    目前,命令检查器工具仅适用于 Web 浏览器,不适用于 Android 和 iOS 应用。 计划将来进行更新,以在这些移动应用中实现此工作。

    启用命令检查器工具后,在应用程序中, (全局、窗体、网格、子网格) 的各个命令栏中,将有一个新的特殊“命令检查器” 按钮打开该工具, (它可能会在 “更多 溢出浮出控件”菜单中列出) 。

  • 导航到应用程序中应显示按钮的页面。

  • 找到应显示按钮的命令栏。

  • 单击“命令检查器” 按钮 (“ 更多 溢出浮出控件菜单) 可能列出它。

  • 在命令检查器工具最左侧窗格中显示的按钮列表中查找并单击按钮。 不可见的按钮将用去强调和斜体字体以及 隐藏) 术语 ( 表示。 以下示例显示联系人实体网格页上的“ 新建 ”按钮不可见,并且由标记为 “新建 (隐藏) 的项表示。

    如果未列出按钮,可能是由于已安装 HideCustomAction 自定义项,或者关联的命令具有 Mscrm.HideOnModern 显示规则。 在编写本指南时,命令检查器工具不会列出已被 或 Mscrm.HideOnModern 显示规则隐藏 HideCustomAction 的按钮。 我们目前正在努力扩充此列表,以在将来的更新中包含此信息。

    如果当所有规则的计算结果都为 True 时,按钮仍然处于隐藏状态,则可能是由于 网格中的上下文敏感命令 导致的。 在网格中选择记录时,没有 SelectionCountRule 元素的所有按钮将被视为与所选记录 () 无关。 即使规则评估为 True ,它们也会被隐藏。 请注意,浮出控件不受影响,因为浮出控件子级可能仍具有基于记录的命令。

  • 单击“ 命令属性 ”选项卡以显示此按钮的命令的详细信息。 这将显示启用规则和显示规则,以及每个规则评估的结果 ( True False 跳过 ) 。 以下示例显示了“ 新建 (隐藏) 按钮的命令 Mscrm.NewRecordFromGrid ,并且存在一个名为 new.contact.EnableRule.EntityRule 的启用规则,该规则的计算结果为 False ,因此该按钮将被隐藏。

  • new.contact.EnableRule.EntityRule 单击 V 形 图标可展开启用规则,以查看规则的详细信息。 若要了解规则的计算结果为何为 True 或 False,需要稍微了解规则的类型。 有关每种类型的规则的详细信息,请参阅 定义功能区启用规则 定义功能区显示规则 。 以下示例显示规则类型为 Entity ,实体逻辑名称为 account 。 由于当前实体是 contact ,这不等于 account ,因此此规则返回 False。

  • 修复按钮可见性所需的方法将取决于特定方案中的各种自定义项。 考虑我们的示例:

  • 如果错误地创建了此规则,使得在规则中声明的实体本来是 联系 实体,但设置为 帐户 ,则可以编辑 new.contact.EnableRule.EntityRule 启用规则并进行更改,使规则的计算结果为 true。
  • 如果无意中将此规则添加到命令,则可以修改命令并从 Mscrm.NewRecordFromGrid 命令定义中删除 new.contact.EnableRule.EntityRule 启用规则。
  • 如果命令是Microsoft已发布定义的替代,则可以删除该命令的此自定义版本以还原默认功能。
  • 从以下任一选项卡中选择修复选项。 第一个选项卡默认处于选中状态。

    修复启用/显示规则 从命令中删除启用/显示规则

    如何删除命令

    如果有另一个解决方案层包含命令的工作定义,则可以删除该定义以还原非活动的工作定义。

    如果这是唯一层,并且不再需要 命令,则可以在没有其他按钮引用命令时将其从解决方案中删除。

    若要删除命令,需要确定哪个解决方案安装了自定义项:

  • 单击命令名称下方的 “查看命令定义解决方案层 ”链接,查看安装了命令定义的解决方案 () 。

  • “解决方案层”窗格将显示已安装特定解决方案的每个功能区组件定义的分层。 列表顶部的层是应用程序使用的当前定义,其他层处于非活动状态,目前应用程序不使用。 如果卸载顶层解决方案或安装了删除定义的更新版本,则下一层将成为应用程序使用的当前活动定义。 当存在非托管 活动 解决方案层时,它将始终是应用程序使用的定义。 如果未列出活动解决方案,则列表顶部列出的解决方案将是应用程序使用的定义。 任何未由 Microsoft 发布的自定义托管解决方案也优先于Microsoft发布的解决方案层。

    实体上下文指示功能区自定义的对象,如果列出了“所有实体”,则层来自应用程序功能区客户端扩展,而不是特定于实体,否则将列出实体的逻辑名称。

    当存在两个或更多层时,可以选择两行并单击“ 比较 ”,查看每个解决方案引入的定义比较。

    单击“ 后退 ”将返回到上一个命令检查器窗口。

    下图显示了示例中 命令的解决方案层,并指示联系人实体有一个解决方案层,即它是名为 Active 的解决方案所表示的非托管自定义项。 你的实际方案可能有所不同,你可能没有 活动 解决方案层,你可能有一个托管解决方案,并且该解决方案的名称将在此处列出。

  • 现在,我们已查看解决方案层并标识了安装自定义项的解决方案,因此必须在相应的解决方案中修复定义。

    选择与特定方案匹配的以下选项之一:

    命令位于非托管活动解决方案中

    若要删除 活动 非托管解决方案层中的命令,我们将导出包含实体或应用程序功能区的非托管解决方案,并在 customizations.xml 文件中编辑 <RibbonDiffXml> 节点,然后导入此解决方案的新版本,其中删除了此命令以删除组件。 请参阅 导出、准备编辑和导入功能区

    命令特定于实体

    根据我们的示例方案,我们确定实体为 contact ,需要删除的命令为 Mscrm.NewRecordFromGrid ,并且它从名为 DefaultPublisherCITTest 的发布者在活动非托管解决方案层中声明。

  • 打开 “高级设置”。

  • 导航到 “设置 > 解决方案 ”。

  • 单击“ 新建 ”创建新解决方案,将 Publisher 设置为命令检查器的解决方案层列表中显示的值,以便为命令层和活动解决方案层显示。 (在我们的示例中,这是 DefaultPublisherCITTest )

  • 单击“ 实体 ”。

  • 单击“ 添加现有项 ”。

  • 选择在 (上定义命令的实体在我们的示例中,这是 联系人 ) 然后单击 “确定 ”。

  • 在单击“ 完成 ”之前,请确保取消选中 “包括实体元数据 ”和“ 添加所有资产 ”选项。

  • 单击 保存

  • 单击“ 导出解决方案 ”并导出非托管解决方案。

  • 提取.zip文件。

  • 打开 customizations.xml 文件。

  • <Entity> 找到要编辑的实体节点的子节点,并找到其子 <RibbonDiffXml> 节点。

  • 找到节点 <CommandDefinition> 。 (在我们的示例中,节点的 <CommandDefinition> ID 为 Mscrm.NewRecordFromGrid ,因此我们会找到以下节点)

  • <RibbonDiffXml> 编辑节点并删除具有要删除的命令 ID 的特定 <CommandDefinition> 节点。 请确保不会无意中删除可能存在的其他 <CommandDefinition> 节点。 (根据我们的示例,我们将删除 <CommandDefinition> ID 为 Mscrm.NewRecordFromGrid .)

  • 保存 customizations.xml 文件。

  • 将修改 后的customizations.xml 文件添加回解决方案.zip文件。

  • 导入解决方案文件。

  • 单击“ 发布所有自定义项 ”。

    命令位于应用程序功能区中, (适用于“所有实体”)

    如果命令不是特定于实体的,而是适用于在应用程序功能区中声明的“所有实体”,则步骤将略有不同,如下所示:

  • 打开 “高级设置”。
  • 导航到 “设置 > 解决方案 ”。
  • 单击“ 新建 ”创建新解决方案,将 Publisher 设置为命令检查器的解决方案层列表中显示的值,以便为命令层和活动解决方案层显示。
  • 单击“ 客户端扩展 ”。
  • 单击“ 添加现有项 ”。
  • 单击“ 应用程序功能区 ”。
  • 单击 保存
  • 单击“ 导出解决方案 ”并导出非托管解决方案。
  • 提取.zip文件。
  • 打开 customizations.xml 文件。
  • 找到根 <RibbonDiffXml> 节点。
  • 找到节点 <CommandDefinition>
  • <RibbonDiffXml> 编辑节点并删除 <CommandDefinition> 具有要删除的命令 ID 的节点。 请确保不会无意中删除可能存在的其他 <CommandDefinitions> 节点。
  • 保存 customizations.xml 文件。
  • 将修改 后的customizations.xml 文件添加回压缩解决方案.zip文件。
  • 导入解决方案文件。
  • 单击“ 发布所有自定义项 ”。
  • 命令来自我的公司创作的自定义托管解决方案

    若要删除由创建的自定义托管解决方案安装的命令,请执行以下步骤:

  • 在具有自定义解决方案的非托管源版本的单独开发组织中,完成上面为 “命令位于非托管活动解决方案 ”选项中列出的步骤。
  • 递增自定义解决方案的版本。
  • 将解决方案导出为托管解决方案。
  • 在单独的受影响的组织中,导入此新版本的自定义托管解决方案。
  • 该命令来自我的公司未从第三方/ISV) 创作 (的自定义托管解决方案

    若要删除由第三方/ISV 创建的自定义托管解决方案安装的命令,需要联系解决方案的作者,并请求已删除特定命令定义的新版本的解决方案,然后将此新解决方案安装到受影响的组织中。

    如何修复启用/显示规则

  • 单击规则名称下方的 “查看规则定义解决方案层 ”链接,查看安装了规则定义的解决方案 () 。

  • “解决方案层”窗格将显示已安装特定解决方案的每个功能区组件定义的分层。 列表顶部的层是应用程序使用的当前定义,其他层处于非活动状态,目前应用程序不使用。 如果卸载顶层解决方案或安装了删除定义的更新版本,则下一层将成为应用程序使用的当前活动定义。 当存在非托管 活动 解决方案层时,它将始终是应用程序使用的定义。 如果未列出活动解决方案,则列表顶部列出的解决方案将是应用程序使用的定义。 任何未由 Microsoft 发布的自定义托管解决方案也优先于Microsoft发布的解决方案层。

    实体上下文指示功能区自定义的对象,如果列出了“所有实体”,则层来自应用程序功能区客户端扩展,而不是特定于实体,否则将列出实体的逻辑名称。

    当存在两个或更多层时,可以选择两行并单击“比较”,查看每个解决方案引入的定义比较。

    单击“ 后退 ”将返回到上一个命令检查器窗口。

    下图显示了示例中启用规则的解决方案层,并指示在本例中存在一个解决方案层,并且它是名为 Active 的解决方案所表示的非托管自定义项。 你的实际方案可能有所不同,你可能不是活动解决方案层,你可能有一个托管解决方案,并且该解决方案的名称将在此处列出。

  • 现在,我们已查看解决方案层并标识了安装自定义项的解决方案,因此必须在相应的解决方案中修复定义。

    选择与特定方案匹配的以下选项之一:

    启用/显示规则位于非托管活动解决方案中

    若要修复 活动 非托管解决方案层中的启用/显示规则,我们将导出包含实体或应用程序功能区的非托管解决方案,并在 customizations.xml 文件中编辑 <RibbonDiffXml> 节点,然后导入包含固定启用/显示规则定义的此解决方案的新版本。 请参阅 导出、准备编辑和导入功能区

    启用/显示规则特定于实体

    根据我们的示例方案,我们确定实体是 contact ,需要修复的启用规则是 new.contact.EnableRule.EntityRule ,并且它从名为 DefaultPublisherCITTest 的发布者在 Active 非托管解决方案层中声明。

  • 打开 “高级设置”。

  • 导航到 “设置 > 解决方案 ”。

  • 单击“ 新建 ”创建新的解决方案,将 Publisher 设置为启用规则和活动解决方案层的命令检查器解决方案层列表中显示的值。 (在我们的示例中,这是 DefaultPublisherCITTest )

  • 单击“ 实体 ”。

  • 单击“ 添加现有项 ”。

  • 选择启用/显示规则在 (在我们的示例中,这是 联系人 ) ,然后单击“ 确定 ”。

  • 在单击“ 完成 ”之前,请确保取消选中 “包括实体元数据 ”和“ 添加所有资产 ”选项。

  • 单击 保存

  • 单击“ 导出解决方案 ”并导出非托管解决方案。

  • 提取.zip文件。

  • 打开 customizations.xml 文件。

  • <Entity> 找到要编辑的实体节点的子节点,并找到其子 <RibbonDiffXml> 节点。

  • 找到启用/显示规则。 (在我们的示例中,启用规则的 ID 为 new.contact.EnableRule.EntityRule ,因此我们会找到以下节点)

  • <RibbonDiffXml> 编辑节点,对启用/显示规则进行必要的更改,使规则在正确情况下的计算结果为 True,以修复规则。 有关声明规则的更多帮助,请参阅 定义功能区启用规则 定义功能区显示规则 。 (根据我们的示例,我们将规则定义更改为以下)

  • 将修改 后的customizations.xml 文件添加回解决方案.zip文件。

  • 导入解决方案文件。

  • 单击“ 发布所有自定义项 ”。

    启用/显示规则位于应用程序功能区中, (适用于“所有实体”)

    如果启用/显示规则不是特定于实体的,而是适用于在应用程序功能区中声明的“所有实体”,则步骤将略有不同,如下所示:

  • 打开 “高级设置”。
  • 导航到 “设置 > 解决方案 ”。
  • 单击“ 新建 ”创建新解决方案,将 Publisher 设置为“启用/显示规则”和“活动”解决方案层的命令检查器解决方案层列表中显示的值。
  • 单击“ 客户端扩展 ”。
  • 单击“ 添加现有项 ”。
  • 单击“ 应用程序功能区 ”。
  • 单击 保存
  • 单击“ 导出解决方案 ”并导出非托管解决方案。
  • 提取.zip文件。
  • 打开 customizations.xml 文件。
  • 找到根 <RibbonDiffXml> 节点。
  • 找到启用/显示规则。
  • <RibbonDiffXml> 编辑节点,对启用/显示规则进行必要的更改,使规则在正确情况下的计算结果为 True,以修复规则。 有关声明规则的更多帮助,请参阅 定义功能区启用规则 定义功能区显示规则
  • 将修改 后的customizations.xml 文件添加回解决方案.zip文件。
  • 导入解决方案文件。
  • 单击“ 发布所有自定义项 ”。
  • 启用/显示规则来自我创作的自定义托管解决方案

    若要修复由创建的自定义托管解决方案安装的启用/显示规则,请执行以下步骤:

  • 在具有自定义解决方案的非托管源版本的单独开发组织中,完成上面为 “启用/显示规则位于非托管活动解决方案 ”选项中列出的步骤。
  • 递增自定义解决方案的版本。
  • 将解决方案导出为托管解决方案。
  • 在单独的受影响的组织中,导入此新版本的自定义托管解决方案。
  • 启用/显示规则来自我未创作的自定义托管解决方案,或者我的组织 (没有第三方/ISV)

    若要修复由第三方/ISV 创建的自定义托管解决方案安装的启用/显示规则,需要联系解决方案的作者,并请求包含固定启用/显示规则定义的新版本的解决方案,并将此新解决方案安装到受影响的组织中。

    启用/显示规则位于发布的Microsoft托管解决方案中

    若要修复Microsoft发布的托管解决方案安装的启用/显示规则,可能需要安装较新版本的解决方案,这通常在发布更新期间完成。 你可能已经发现了一个仍需要修复的 bug。 请联系客户支持以获取帮助。

    如何修复命令

    为了修复命令,我们需要确定哪个解决方案安装了自定义项。

  • 单击命令名称下方的 “查看命令定义解决方案层 ”链接,查看安装了命令定义的解决方案 () 。

  • “解决方案层”窗格将显示已安装特定解决方案的每个功能区组件定义的分层。 列表顶部的层是应用程序使用的当前定义,其他层处于非活动状态,目前应用程序不使用。 如果卸载顶层解决方案或安装了删除定义的更新版本,则下一层将成为应用程序使用的当前活动定义。 当存在非托管 活动 解决方案层时,它将始终是应用程序使用的定义。 如果未列出活动解决方案,则列表顶部列出的解决方案将是应用程序使用的定义。 任何未由 Microsoft 发布的自定义托管解决方案也优先于Microsoft发布的解决方案层。

    实体上下文指示功能区自定义的对象,如果列出了“所有实体”,则层来自应用程序功能区客户端扩展,而不是特定于实体,否则将列出实体的逻辑名称。

    当存在两个或更多层时,可以选择两行并单击“比较”,查看每个解决方案引入的定义比较。

    单击“ 后退 ”将返回到上一个命令检查器窗口。

    下图显示了示例中命令的解决方案层,并指示此联系人中有一个解决方案层,并且它是名为 Active 的解决方案所表示的非托管自定义项。 你的实际方案可能有所不同,你可能没有活动解决方案层,你可能有一个托管解决方案,并且该解决方案的名称将在此处列出。

  • 现在,我们已查看解决方案层并标识了安装自定义项的解决方案,因此必须在相应的解决方案中修复定义。

    选择与特定方案匹配的以下选项之一:

    命令位于非托管活动解决方案中

    若要修复活动非托管解决方案层中的命令,我们将导出包含实体或应用程序功能区的非托管解决方案,并在 customizations.xml 文件中编辑 <RibbonDiffXml> 节点,然后导入包含固定命令定义的此解决方案的新版本。 请参阅 导出、准备编辑和导入功能区

    不要从命令中删除 Mscrm.HideOnModern 显示规则,以强制按钮显示在统一接口中。 具有显示规则的 Mscrm.HideOnModern 命令适用于旧版 Web 客户端接口,在统一接口中不受支持,并且可能无法正常工作。

    命令特定于实体

    根据我们的示例方案,我们确定实体为 contact ,需要修复的命令为 Mscrm.NewRecordFromGrid ,并且该实体在名为 DefaultPublisherCITTest 的发布者的活动非托管解决方案层中声明。

  • 打开 “高级设置”。

  • 导航到 “设置 > 解决方案 ”。

  • 单击“ 新建 ”创建新解决方案,将 Publisher 设置为命令检查器的解决方案层列表中显示的值,以便为命令层和活动解决方案层显示。 (在我们的示例中,这是 DefaultPublisherCITTest )

  • 单击“ 实体 ”。

  • 单击“ 添加现有项 ”。

  • 选择在 (上定义命令的实体在我们的示例中,这是 联系人 ) 然后单击 “确定 ”。

  • 在单击“ 完成 ”之前,请确保取消选中“ 包括实体元数据 ”和“ 添加所有资产 ”选项。

  • 单击 保存

  • 单击“ 导出解决方案 ”并导出非托管解决方案。

  • 提取.zip文件。

  • 打开 customizations.xml 文件。

  • <Entity> 找到要编辑的实体节点的子节点,并找到其子 <RibbonDiffXml> 节点。

  • 找到节点 <CommandDefinition> 。 (在我们的示例中,节点的 <CommandDefinition> ID 为 Mscrm.NewRecordFromGrid ,因此我们会找到以下节点)

  • <RibbonDiffXml> 编辑节点,对节点进行必要的更改, <CommandDefinition> 以允许命令在正确情况下正常运行,以修复命令。 有关声明命令的更多帮助,请参阅 定义功能区命令 。 (根据我们的示例,我们将通过删除导致隐藏按钮的 new.contact.EnableRule.EntityRule 启用规则来修改 <CommandDefinition> 节点。)

  • 将修改 后的customizations.xml 文件添加回解决方案.zip文件

  • 导入解决方案文件。

  • 单击“ 发布所有自定义项 ”。

    命令位于应用程序功能区中, (适用于“所有实体”)

    如果命令不是特定于实体的,而是适用于在应用程序功能区中声明的“所有实体”,则步骤将略有不同,如下所示:

  • 打开 “高级设置”。
  • 导航到 “设置 > 解决方案 ”。
  • 单击“ 新建 ”创建新解决方案,将 Publisher 设置为命令检查器的解决方案层列表中显示的值,以便为命令层 和活动解决方案层 显示。
  • 单击“ 客户端扩展 ”。
  • 单击“ 添加现有项 ”。
  • 单击“ 应用程序功能区 ”。
  • 单击 保存
  • 单击“ 导出解决方案 ”并导出非托管解决方案。
  • 提取.zip文件。
  • 打开 customizations.xml 文件。
  • 找到根 <RibbonDiffXml> 节点。
  • 找到节点 <CommandDefinition>
  • <RibbonDiffXml> 编辑节点,对节点进行必要的更改, <CommandDefinition> 以允许命令在正确情况下正常运行,以修复命令。 有关声明命令的更多帮助,请参阅 定义功能区命令
  • 将修改 后的customizations.xml 文件添加回解决方案.zip文件。
  • 导入解决方案文件。
  • 单击“ 发布所有自定义项 ”。
  • 命令来自我创作的自定义托管解决方案

    若要修复由创建的自定义托管解决方案安装的命令,请执行以下步骤:

  • 在具有自定义解决方案的非托管源版本的单独开发组织中,完成上面为 “命令位于非托管活动解决方案 ”选项中列出的步骤。
  • 递增自定义解决方案的版本。
  • 将解决方案导出为托管解决方案。
  • 在单独的受影响的组织中,导入此新版本的自定义托管解决方案。
  • 命令来自我未创作的自定义托管解决方案,或者我的组织 (没有来自第三方/ISV)

    若要修复由第三方/ISV 创建的自定义托管解决方案安装的命令,需要联系解决方案的作者,并请求包含固定命令定义的新版本的解决方案,并将此新解决方案安装到受影响的组织中。

    命令位于已发布Microsoft托管解决方案中

    若要修复Microsoft已发布的托管解决方案安装的命令,可能需要安装较新版本的解决方案,这通常在发布更新期间完成。 你可能已经发现了一个仍需要修复的 bug。 请联系客户支持以获取帮助。

  •