我是微软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图标出来的窗口截图如下。
可以看到有个 【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.
然后我们转到 Advanced Settings > Customization > Solution History 去看,注意切换到 Ribbon Metadata Generation Operations 或者 All Operations视图 ,我这里截图如下:
然后重点介绍下命令栏中的Command Checker按钮,左边栏中按钮文字旁边如果有 (hidden) 字样代表该按钮是隐藏的,右边显示了按钮的很多属性,比如Id,LabelText等,可以看到有个链接,链接文本是 View button solution layers 。
点击 View button solution layers 链接会打开类似下面的窗口。如果Solution layer有多个的话,可以选中两个点击下面的【Compare】按钮就会出来比较。
对于使用托管解决方案部署的话,很容易存在多个solution layer,我这里提供一个Compare的结果截图如下,可以看到右边的Solution产生的solution layer 增加了一个Display Rule,这样比较起来还是很容易的。
这里提一个小技巧,如果是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。
那我们展开去看看到底是什么规则返回false,展开如下。可知是一个OrBlockRule下面的两个Rule都返回了False,都是FormStateState,这样就知道为啥没有显示了。
如果要看点击后执行的是什么,可以看下这个按钮的Actions,我这里截图如下。