![](/img/trans.png)
[英]dynamics 365 crm managed solution not overriding Javascript webresource
[英]Dynamics 365 CRM Plugin - Unable to set two option field NULL in managed solution
我有 2 個環境:開發和測試。 我想實現如下所述的功能:
if (fields.email.getValue() == null) {
fields.emailAllowed.setValue(null);
fields.emailAllowed.setRequiredLevel("required");
}
else {
fields.emailAllowed.setRequiredLevel("none");
}
if (fields.phone.getValue() == null) {
fields.phoneAllowed.setValue(null);
fields.phoneAllowed.setRequiredLevel("required");
}
else {
fields.phoneAllowed.setRequiredLevel("none");
}
此 JavaScript 代碼在 DEV 環境中運行良好,但由於某些未知原因,它沒有在 TEST 環境中保存 NULL 值。
為了支持這一點,我添加了一個新的 CRM 插件,我在其中創建了兩個處理程序:
創建插件 ==> 預驗證
更新插件 ==> 預驗證
在這兩個插件中,我使用的邏輯如下:
// Gets PreImage & Target Image combined
public void Execute()
{
var combinedTarget = GetCombinedTarget();
if (combinedTarget == null)
{
// log & throw error
}
MapEmailField(combinedTarget);
MapPhoneField(combinedTarget);
}
private void MapEmailField(combinedTarget)
{
// if Email is NULL and EmailAllowed IS NULL
if(combinedTarget.Metadata.Attributes.Email != null && combinedTarget.Metadata.Attributes.EmailAllowed == null)
{
//log & throw error
}
else if(combinedTarget.Metadata.Attributes.Email == null)
{
combinedTarget.Metadata.Attributes.EmailAllowed = null; // To save NULL value into CRM field
}
}
// same method for phone field mapping
// save the record
現在在 CRM UI 中,當我更新 email 字段時,它也會自動將 TRUE 值設置為Phone Allowed字段,即使它沒有更改並且我已經在 CRM 插件中外部設置了 NULL 。 還有 5 個這樣的領域也以同樣的方式受到影響。
相同的更改在 DEV 環境中運行良好,但在 TEST 環境中卻不行。
注意:我已經交叉驗證了 DEV 環境的所有更改都已移至托管解決方案中,並且在 TEST 環境中。
更新 1:
我今天嘗試在TEST環境中調試 JavaScript 更改,並通過它正確更新了記錄。 但是當我關閉調試器並使用新記錄測試相同的場景時,它再次更新了所有記錄!
更新 2:
由於我的 JavaScript function 也在 onLoad 事件中被調用,因此它可以設置 NULL 值,但在常規模式下看起來它無法找到原因,但它是調試的原因。
下面是在 onLoad 事件中執行的 Javascript function:
function handleAllowedFields(dataField, allowedField) {
return function () {
if (dataField == null || allowedField == null) {
return;
}
if (dataField.getValue() == null) {
allowedField.setValue(null);
allowedField.setRequiredLevel("none");
allowedField.controls.forEach(function (c) {
c.setDisabled(true);
});
} else {
// If dataField is having a value, then contact preference fields
// can have an value as Allow OR DoNotAllow ONLY.
allowedField.controls.forEach(function (c) {
c.setDisabled(false);
});
allowedField.setRequiredLevel("required");
}
}
}
關於如何讓我的 function 等到所有控件在 onLoad 事件中加載到表單上的任何幫助?
如您所知,CRM 兩個選項不足以存儲 NULL 或將其視為可 NULL 的 boolean 字段。 具有兩個值的全局或本地選項集(這允許 NULL) - 這將允許使用 NULL 值開始記錄,並且不需要 javascript 或插件每次都按摩數據。
無論如何,當數據導入發生或平台外的任何東西(如 web api 調用)時,腳本不會觸發 - 所以插件是不錯的選擇。
發現問題。
托管解決方案確實無法為two option type
字段保存 NULL 值。 雖然它能夠在非托管解決方案中做到這一點。
除此之外,我發現在 JavaScript 中的 onSave 事件之后沒有執行 onLoad 事件,這就是問題背后的原因。
因此,我作為解決方案所做的是在表單上的modifiedon
字段中添加了一個 onChange 事件,它就像黃油一樣工作。
PS:我沒有使用OptionSet
而不是TwoOptionSet
字段,以便客戶可以正確使用默認字段來處理其他所有內置功能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.