我找到了此链接并在新的 Dynamics Trial(2020 年发布第 2 波)中验证了它,并且 XRM 组件似乎在那里:
参考链接: https://community.dynamics.com/crm/b/dynamicscrmdevdownunder/posts/cancelling-save-event-based-on-the-result-of-async-operation https://community.dynamics.com/crm/b/dynamicscrmdevdownunder/posts/cancelling-save-event-based-on-the-result-of-async-operation
MSDN 参考:https://learn.microsoft.com/en-us/powerapps/developer/model-driven-apps/clientapi/reference/formcontext-data-entity/addonsave https://learn.microsoft.com/en-us/powerapps/developer/model-driven-apps/clientapi/reference/formcontext-data-entity/addonsave
附加评论Save and Close
:https://dreamingincrm.com/2017/10/12/cancelling-save-event-based-on-the-result-of-async-operation/ https://dreamingincrm.com/2017/10/12/cancelling-save-event-based-on-the-result-of-async-operation/
编辑,使其不是“仅链接”答案
- Uses
Clone
创建副本Xrm.Page.ui
and Xrm.Page.data.entity
- 这样如果用户按下Save and Close
这些对象仍然可用
- Creates
saveHandler
使用的方法RetrieveMultiple
模拟异步验证过程
Code:
Xrm.Page.data.entity.addOnSave((()=>{
let isSave = false;
var uiClone = parent.jQuery.extend(true, {}, Xrm.Page.ui);
var entityClone = parent.jQuery.extend(true, {}, Xrm.Page.data.entity);
var closeHandler = ()=>{
console.log('local. close blocked.');
};
var saveHandler = (ev)=>{
console.log('local. save blocked.');
Xrm.WebApi.retrieveMultipleRecords('systemuser','$select=fullname,jobtitle,homephone').then(x=>{
isSave = !x.entities.some(x=>x.homephone == '12345');
if(isSave){
Xrm.Page.data.entity.save = entityClone.save;
Xrm.Page.ui.close = uiClone.close;
if((typeof ev === 'string' && ev === 'saveandclose') ||
(ev.getEventArgs && ev.getEventArgs() && ev.getEventArgs().getSaveMode() === 2)){
console.log('saveandclose');
entityClone.save('saveandclose');
}
else{
console.log('save');
entityClone.save();
}
}
else{
console.log('User with homephone 12345 exists. Save blocked.');
}
});
};
return (e)=>{
var eventArgs = e.getEventArgs();
console.log(`DataXml OnSave: ${Xrm.Page.data.entity.getDataXml()}`);
console.log(`Save Mode: ${eventArgs.getSaveMode()}`);
if(isSave) {
console.log('proceed to save');
Xrm.Page.data.entity.save = entityClone.save;
Xrm.Page.ui.close = uiClone.close;
return;
}
else{
Xrm.Page.data.entity.save = saveHandler;
Xrm.Page.ui.close = closeHandler;
if(eventArgs.getSaveMode() !== 2){
eventArgs.preventDefault();
}
saveHandler(e);
}
}
})());
此代码示例的所有功劳均归原作者所有。