這是我的第526篇原創文章,寫於2025年11月26日。

主要根據官方文檔 Override the default open behavior of data rows in an entity-bound grid 而寫。

比如我有個類似需求,account表的列表,我需要有A角色的人雙擊的話,打開的是一個自定義的HTML Web資源來更好的展示內容,其餘的人我使用原生的CRM表單展示就可以了。

要實現這樣的效果,就需要用到我今天寫的文章介紹的方法。我需要向這個表的列表命令欄(HomepageGrid) 添加一個按鈕,這個按鈕對應的命令的CommandDefinition 元素的Id屬性值需要設置為 Mscrm.OpenRecordItem 。這個按鈕可以隱藏,也就是通過設置一個一直返回false的enable rule或者display rule來隱藏這個按鈕。這個command執行的方法一般是JavaScript Web資源中的一個函數,比如我的是 new.account.OpenRecordItem.EnableRule 這個方法,一般需要將當前雙擊(要打開)的記錄的Id傳遞給打開的HTML Web資源.

這裏用到的RibbonDiffXml參考如下:

<RibbonDiffXml>
   <CustomActions>
     <CustomAction Id="new.Mscrm.OpenRecordItem.Mscrm.HomepageGrid.account.MainTab.Management.CustomAction" Location="Mscrm.HomepageGrid.account.MainTab.Management.Controls._children" Sequence="15">
       <CommandUIDefinition>
         <Button Command="Mscrm.OpenRecordItem" Id="Mscrm.OpenRecordItem" LabelText="$LocLabels:Mscrm.OpenRecordItem.Mscrm.HomepageGrid.account.MainTab.Management.LabelText" Sequence="15" TemplateAlias="o1" />
       </CommandUIDefinition>
     </CustomAction>
   </CustomActions>
   <Templates>
     <RibbonTemplates Id="Mscrm.Templates"></RibbonTemplates>
   </Templates>
   <CommandDefinitions>
     <CommandDefinition Id="Mscrm.OpenRecordItem">
       <EnableRules>
         <EnableRule Id="new.account.OpenRecordItem.EnableRule" />
       </EnableRules>
       <DisplayRules />
       <Actions>
         <JavaScriptFunction FunctionName="LY.AccountRibbon.onOverrideOpenBehavior" Library="$webresource:new_/scripts/accountribbon.js">
           <CrmParameter Value="SelectedControlSelectedItemReferences" />
         </JavaScriptFunction>
       </Actions>
     </CommandDefinition>
   </CommandDefinitions>
   <RuleDefinitions>
     <TabDisplayRules />
     <DisplayRules />
     <EnableRules>
       <EnableRule Id="new.account.OpenRecordItem.EnableRule">
         <PageRule Address="https://unavailable.crm.dynamics.cn" Default="false" InvertResult="false" />
       </EnableRule>
     </EnableRules>
   </RuleDefinitions>
   <LocLabels>
     <LocLabel Id="Mscrm.OpenRecordItem.Mscrm.HomepageGrid.account.MainTab.Management.LabelText">
       <Titles>
         <Title description="Hide me" languagecode="1033" />
       </Titles>
     </LocLabel>
   </LocLabels>
 </RibbonDiffXml>


我用的函數類似如下:

/* global Xrm */
var LY = LY || {};
(function (LY) {
    class AccountRibbon {
        static CheckUserHasRoles(checkRoles) {
            var returnVal = false;
            var currentRoles = Xrm.Utility.getGlobalContext().userSettings.roles;
            checkRoles.split(',').forEach(function (checkRole) {
                currentRoles.forEach(function (currentRole) {
                    if (checkRole.toLowerCase() === currentRole.name.toLowerCase()) {
                        returnVal = true;
                    }
                });
            });
            return returnVal;
        }

        static onOverrideOpenBehavior(selectedControlSelectedItemReferences) {
            if (this.CheckUserHasRoles("Role name")) {
                var pageInput = {
                    pageType: "webresource",
                    webresourceName: "new_/pages/accountcustompage.html",
                    data: `id=${selectedControlSelectedItemReferences[0].Id}`
                };
                var navigationOptions = {
                    target: 1
                };
                Xrm.Navigation.navigateTo(pageInput, navigationOptions);
            }
            else {
                var pageInput = {
                    pageType: "entityrecord",
                    entityName: selectedControlSelectedItemReferences[0].TypeName,
                    entityId: selectedControlSelectedItemReferences[0].Id 
                };
                var navigationOptions = {
                    target: 1
                };
                Xrm.Navigation.navigateTo(pageInput, navigationOptions);
            }
        }
    }
    LY.AccountRibbon = AccountRibbon;
})(LY);