這是我的第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);