我是微软Dynamics 365 & Power Platform方面的工程师/顾问罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面的微软最有价值专家(Microsoft MVP),欢迎关注我的微信公众号 MSFTDynamics365erLuoYong ,回复445或者20210610可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!

Command Checker是排查按钮为什么没有按照期望的隐藏/显示,按钮的定义(如定义的Enable Rule, Display Rule, 执行的Action)等的利器,介绍它的官方博文请参考 Introducing Command Checker for model-app ribbons ,我就不一一翻译了,捡重点简要说说。

假设我打开的页面是 https://luoyongdemo.crm5.dynamics.com/main.aspx?appid=485f3e02-f496-eb11-b1ac-0022485699e8&pagetype=entityrecord&etn=appointment&id=4c008680-32c4-eb11-8235-000d3ac81031 ,那么我要显示出Command Checker很简单,在打开的Url最后加上 ribbondebug=true 即可,比如我这里就用 https://luoyongdemo.crm5.dynamics.com/main.aspx?appid=485f3e02-f496-eb11-b1ac-0022485699e8&pagetype=entityrecord&etn=appointment&id=4c008680-32c4-eb11-8235-000d3ac81031&ribbondebug=true 。

然后我们就会发现两个变化如下图,一个是最右上角的设置图标旁边多出了一个图标,这个图标我姑且称之为全局的Command Checker图标,另外就是命令栏的最后会多出一个Command Checker按钮。

介绍Command Checker及重新生成Ribbon元数据的方法_按钮

 

点击全局的Command Checker图标出来的窗口截图如下。

介绍Command Checker及重新生成Ribbon元数据的方法_Command Bar_02

 

可以看到有个 【Regenerate ribbon metadata】,这个有时候会有用处,比如按钮的定义等都没有问题,就是看不到,那有可能是ribbon metadata生成有问题,这个时候可以试试点击这个按钮,我们点击看下,有提示如下:

Do you want to regenerate all ribbon client metadata for this environment? This background operation may take 15 minutes or longer and may delay other background operations while in-progress. The status can be viewed within Solution history. Once completed clear your browser cache and reopen the application.

介绍Command Checker及重新生成Ribbon元数据的方法_Dynamics 365_03

然后我们转到 Advanced Settings > Customization > Solution History 去看,注意切换到 Ribbon Metadata Generation Operations 或者 All Operations视图 ,我这里截图如下:

介绍Command Checker及重新生成Ribbon元数据的方法_Dynamics 365_04

 

然后重点介绍下命令栏中的Command Checker按钮,左边栏中按钮文字旁边如果有 (hidden) 字样代表该按钮是隐藏的,右边显示了按钮的很多属性,比如Id,LabelText等,可以看到有个链接,链接文本是 View button solution layers 。

介绍Command Checker及重新生成Ribbon元数据的方法_Dynamics 365_05

 

点击 View button solution layers 链接会打开类似下面的窗口。如果Solution layer有多个的话,可以选中两个点击下面的【Compare】按钮就会出来比较。

介绍Command Checker及重新生成Ribbon元数据的方法_Dynamics 365_06

 

对于使用托管解决方案部署的话,很容易存在多个solution layer,我这里提供一个Compare的结果截图如下,可以看到右边的Solution产生的solution layer 增加了一个Display Rule,这样比较起来还是很容易的。

介绍Command Checker及重新生成Ribbon元数据的方法_Command Bar_07

这里提一个小技巧,如果是Entity Ribbon有unmanaged layer的话,如何去掉呢?目前我知道的有效方法是,将实体的元数据通过一个非托管解决方案导出,然后修改解决方案中的 customizations.xml 文件,将 RibbonDiffXml 元素的值修改为如下值,也就是设置为没有定制该实体Ribbon的样子,导入到目标环境就会去掉unmanager layer. 当然还是要告诫各位如果使用托管解决方案来做部署的话,不要手工在目标环境修改元数据。

<RibbonDiffXml>
  <CustomActions />
  <Templates>
    <RibbonTemplates Id="Mscrm.Templates"/>
  </Templates>
  <CommandDefinitions />
  <RuleDefinitions>
    <TabDisplayRules />
    <DisplayRules />
    <EnableRules />
  </RuleDefinitions>
  <LocLabels />
</RibbonDiffXml>

 

然后我们来看看Command properties,这个Mark Complete按钮为啥没有显示,可以看到是因为一个名称为 Mscrm.CanSavePrimary 的Enable Rule返回了false。

 介绍Command Checker及重新生成Ribbon元数据的方法_Dynamics 365_08

 

那我们展开去看看到底是什么规则返回false,展开如下。可知是一个OrBlockRule下面的两个Rule都返回了False,都是FormStateState,这样就知道为啥没有显示了。

介绍Command Checker及重新生成Ribbon元数据的方法_Dynamics 365_09

 

如果要看点击后执行的是什么,可以看下这个按钮的Actions,我这里截图如下。

介绍Command Checker及重新生成Ribbon元数据的方法_Command Bar_10