我们正在进行补救,重新设计旧的JS网络资源以用于最新的D365 v9 sdk更改w.r.t客户端脚本API改进&弃用。
使用Xrm.WebApi
重写网络api方法时,我们最终会使用此拦截器。
方案是将null
设置为查找,并尝试以下代码:
var data = {
"abc_relatedentity@odata.bind": null
};
Xrm.WebApi.updateRecord("abc_entity", abc_entityid, data).then(successCallback, errorCallback);
这是抛出错误:
"' odata.bind'实例或属性注释具有空值。在OData中,' odata.bind'实例或属性注释必须具有非空字符串值。"
我们的想法是淘汰以下冗余的XHR请求代码。但这是我们现在唯一的解决方法(引用MSDN)。
var req = new XMLHttpRequest();
req.open("DELETE", Xrm.Utility.getGlobalContext().getClientUrl() + "/api/data/v9.0/accounts(recordGUID)/account_parent_account/$ref", true);
req.setRequestHeader("Accept", "application/json");
req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
req.setRequestHeader("OData-MaxVersion", "4.0");
req.setRequestHeader("OData-Version", "4.0");
req.onreadystatechange = function() {
if (this.readyState === 4) {
req.onreadystatechange = null;
if (this.status === 204 || this.status === 1223) {
//Success - No Return Data - Do Something
}
}
};
req.send();
任何人都面对这个&处理了吗?我错过了什么吗?
答案 0 :(得分:1)
您必须使用Delete方法删除查找值 格式如下: /api/data/v8.0/accounts(1DD18913-11CB-E511-80D2-C4346BDC11C1)/ primarycontactid / $ ref
答案 1 :(得分:0)
要在查找使用上设置null:
var data = { _[LookupFieldName]_value : null }
Xrm.WebApi.updateRecord("abc_entity", abc_entityid, data).then(successCallback, errorCallback
例如,要删除您需要使用的contact.parentcustomerid
字段值:
var data = {};
data._parentcustomerid_value = null
var t = await Xrm.WebApi.updateRecord("contact", "{0200E6F5-1D21-E811-A954-0022480042B3}", data)
答案 2 :(得分:0)
我刚刚在v9.1.0.3832中尝试过
ignore-dependencies
正在为我工作。
var data = { _[LookupFieldName]_value : null }
答案 3 :(得分:0)
您应该尝试 Xrm.WebApi.online.execute 或 Xrm.WebApi.online.executeMultiple
var Sdk = window.Sdk || {};
/**
* Request to execute an update operation
*/
Sdk.UpdateRequest = function(entityName, entityId, payload) {
this.etn = entityName;
this.id = entityId;
this.payload = payload;
};
// NOTE: The getMetadata property should be attached to the function prototype instead of the
// function object itself.
Sdk.UpdateRequest.prototype.getMetadata = function () {
return {
boundParameter: null,
parameterTypes: {},
operationType: 2, // This is a CRUD operation. Use '0' for actions and '1' for functions
operationName: "Update",
};
};
// Construct a request object from the metadata
var payload = {
"_abc_relatedentity_value": null
};
var updateRequest = new Sdk.UpdateRequest("abc_entity", abc_entityid, payload);
// Use the request object to execute the function
Xrm.WebApi.online.execute(updateRequest).then(
function (response) {
console.log(response)
},
function(error) {
console.log(error.message);
// handle error conditions
}
);
答案 4 :(得分:0)
我认为将列设置为 null 就足够了,请确保您删除了 '@odata.bind'
var 数据 = { “abc_relatedentity”:空 };
这对我有用。
答案 5 :(得分:-1)
好消息!您可以通过将此标头添加到您的请求中,将null
请求中的PATCH
设置为查找字段。
autodisassociate: true
然后您可以使用类似的方法以任何方式更改您的查找字段:
SetLookupField(requestBody, "systemusers", "msdfm_MyUser", null)
// Or
SetLookupField(requestBody, "systemusers", "msdfm_MyUser", "f5b0b514-aea8-ea11-a812-000d3a569fe1")
// ...
private static void SetLookupField(JObject requestBody, string typePlural, string name, string value)
{
if (!string.IsNullOrEmpty(value))
{
requestBody.Add($"{name}@odata.bind", $"/{typePlural}({value})");
}
else
{
requestBody.Add($"_{name.ToLower()}_value", null);
}
}
OP无论如何都使用XMLHttpRequest
,所以我认为,使用PATCH
进行此操作的方法在这里很重要。