我有以下脚本,它成功验证表单上是否存在与当前项目处于同一级别的子项目,并在验证失败时给出对话。我想要做的是,如果验证失败,则阻止表单保存,但如果验证正常,则允许保存表单。我一直在兜圈子,却一无所获,任何帮助将不胜感激
//On Save validation
varProjectMainForm = (function () {
"use strict";
var SaveMode = {
Save: 1,
SaveAndClose: 2,
SaveAndNew: 59,
Autosave: 70
};
var saveMode;
var hasCheckedConflict = false;
function OnSave(executionContext) {
//preventing of the save operation before async operation is started
var eventArgs = executionContext.getEventArgs();
var formContext = executionContext.getFormContext();
/* if (!hasCheckedConflict)
{
executionContext.getEventArgs().preventDefault();
}
else
{
formContext.data.entity.save()
} */
saveMode = executionContext.getEventArgs().getSaveMode();
// Specific validation for existing records (not new)
if (formContext.ui.getFormType() === 2) {
if (!hasCheckedConflict) {
hasCheckedConflict = true;
fetchChildrenProjects(formContext, eventArgs);
}
} else {
console.log("Skipping execution for new records"); // Log for new records, no validation needed
}
/* if (eventArgs.isDefaultPrevented()) {
return; // No further validation is required if default save has been prevented
} */
//saveMode = eventArgs.getSaveMode();
if (![SaveMode.Save, SaveMode.SaveAndClose, SaveMode.SaveAndNew, SaveMode.Autosave].includes(saveMode)) {
return; // Exit if the save mode is not one of the expected modes
}
}
function fetchChildrenProjects(formContext, eventArgs) {
var projectID = formContext.getAttribute("dmis_dmisid").getValue();
var projectLevel = formContext.getAttribute("dmis_displaylevel").getValue();
var fetchXML = "<fetch top='1'>" +
"<entity name='dmis_dmishierarchy'>" +
"<attribute name='dmis_dmishierarchyid'/>" +
"<filter>" +
"<condition attribute='dmis_dmisid' operator='eq' value='" + projectID + "'/>" +
"</filter>" +
"</entity>" +
"</fetch>";
var encodedFetchXML = encodeURIComponent(fetchXML);
Xrm.WebApi.retrieveMultipleRecords("dmis_dmishierarchy", "?fetchXml=" + encodedFetchXML).then(
function success(result) {
if (result.entities.length > 0) {
var hierarchyId = result.entities[0].dmis_dmishierarchyid;
checkForConflict(formContext, projectLevel, hierarchyId, eventArgs);
} else {
console.log("No children projects found for: " + projectID);
// eventArgs.preventDefault();
}
},
function (error) {
Xrm.Navigation.openAlertDialog({ text: "Error retrieving hierarchy ID: " + error.message });
// eventArgs.preventDefault();
}
);
}
function checkForConflict(formContext, projectLevel, hierarchyId, eventArgs) {
var fetchXML = "<fetch>" +
"<entity name='dmis_dmishierarchy'>" +
"<attribute name='dmis_displaylevel'/>" +
"<filter>" +
"<condition attribute='dmis_parent' operator='eq' value='" + hierarchyId + "'/>" +
"</filter>" +
"</entity>" +
"</fetch>";
var encodedFetchXML = encodeURIComponent(fetchXML);
Xrm.WebApi.retrieveMultipleRecords("dmis_dmishierarchy", "?fetchXml=" + encodedFetchXML).then(
function success(result) {
if (result.entities.some(entity => entity.dmis_displaylevel <= projectLevel)) {
Xrm.Navigation.openAlertDialog({
title: "Save Conflict",
text:"Cannot save due to this object having children at or below this display level."
})
hasCheckedConflict = true;
} else {
//There's no issue, allow saving
//and save event is called again
if (saveMode === SaveMode.Save || saveMode === SaveMode.Autosave) {
formContext.data.entity.save();
hasCheckedConflict = true;
} else if (saveMode === SaveMode.SaveAndClose) {
formContext.data.entity.save("saveandclose");
} else {
formContext.data.entity.save("saveandnew");
}
}
},
function (error) {
Xrm.Navigation.openAlertDialog({ text: "Error checking for conflicts: " + error.message });
eventArgs.preventDefault(); // Error occurred, prevent save
}
);
}
return {
OnSave: OnSave
};
})();
我尝试添加验证检查和更新全局变量,但似乎没有任何效果。验证确实可以防止默认关闭,但一旦我添加executionContext.getEventArgs().preventDefault();它不会保存任何记录
也许检查模型驱动应用程序是否启用了异步保存处理程序。 另请注意,异步保存处理程序有 10 秒的超时时间。您可能想要检查该流程检查需要多长时间,并确保您可以将多个 Web api 调用包装在 Promise.all() 方法中。 我假设您已经查看了文档,但这里是 OnSave Event 的链接
个人看看你在 JS 中使用 fetchxml 查询做了什么,然后比较/检查冲突...我会在预验证上使用自定义插件,最后插件只会处理逻辑检查,如果它无效,它根本不会保存它。
希望这有帮助! :)