'An undeclared property' 尝试通过 Web 创建记录时 API
'An undeclared property' when trying to create record via Web API
我收到一个似乎无法调试的错误。我正在尝试通过自定义 HTML/JavaScript 网络资源创建自定义 activity 实体。
用户点击一个按钮和以下参数:
var params = {
'rob_faqid@odata.bind': '/rob_faqs(guid-here)',
'rob_source': 180840000,
'subject': 'Signpost',
'actualstart': new Date(),
'actualend': new Date()
};
传递给这个URL:
https://dynamicsorg/api/data/v8.2/rob_quickactions/
与以下 headers:
xhr.setRequestHeader('OData-MaxVersion', '4.0');
xhr.setRequestHeader('OData-Version', '4.0');
xhr.setRequestHeader('Accept', 'application/json');
xhr.setRequestHeader('Content-Type', 'application/json; charset=utf-8');
xhr.setRequestHeader('Prefer', 'return=representation');
这给了我一个 400 (bad request)
的 HTTP 代码和这个错误消息:
An undeclared property 'rob_faqid' which only has property annotations in the payload but no property value was found in the payload. In OData, only declared navigation properties and declared named streams can be represented as properties without values.
有趣的是,无论是使用实际的 GUID 还是在其中放置了一些乱码(表明这与传入的值无关),我都会收到此错误。
我可以通过标准表格手动创建记录。
我在同一个项目的其他地方使用 odata.bind
,没有错误。
睡了一觉后我意识到我的错误。要设置查找字段的值,您需要使用关系方案名称,而不是 属性 名称。
一旦我改变了它,一切正常。
如果您想在通过网络创建或更新(新)记录期间设置查找字段的值 API,您必须使用 架构名称或查找的逻辑名称 后跟绑定注释。
- 对于默认字段,如
primarycontactid
,必须使用逻辑名称(屏幕截图的第一列)。
- 对于自定义字段,如
rob_FaqId
,必须使用架构名称(屏幕截图中的第二列)。
var params = {
'rob_FaqId@odata.bind': '/rob_faqs(guid-here)',
'rob_source': 180840000,
'subject': 'Signpost',
'actualstart': new Date(),
'actualend': new Date()
};
解决方案的屏幕截图 > 实体 > 您的实体 > 字段:
因此,通过网络 API 使用已设置的查找字段创建新记录的一般结构是这样的:
{
"logicalorschemaName@odata.bind": "/relatedentitys(guid)" //don't forget the plural 's'
}
或 official documentation 中的另一个示例。如何创建新的客户记录并直接将现有联系人指定为主要联系人。
var newAccountRecordObj = {
"name": "Sample Account",
"primarycontactid@odata.bind": "/contacts(00000000-0000-0000-0000-000000000001)"
}
虽然在这种情况下接受的答案是正确的,但这似乎并不是全部。在某些情况下,有必要使用 <logical name>_<entity name>
。例如,在执行 POST sharepointdocumentlocations
时,我必须使用:
"regardingobjectid_contact@odata.bind": "/contacts(xxxx)"
"parentsiteorlocation_sharepointdocumentlocation@odata.bind" "/sharepointdocumentlocations(xxx)"
这可能与这些关系可以指向不止一种类型的实体这一事实有关,但我还没有找到任何关于它的 Microsoft 文档。
我收到一个似乎无法调试的错误。我正在尝试通过自定义 HTML/JavaScript 网络资源创建自定义 activity 实体。
用户点击一个按钮和以下参数:
var params = {
'rob_faqid@odata.bind': '/rob_faqs(guid-here)',
'rob_source': 180840000,
'subject': 'Signpost',
'actualstart': new Date(),
'actualend': new Date()
};
传递给这个URL:
https://dynamicsorg/api/data/v8.2/rob_quickactions/
与以下 headers:
xhr.setRequestHeader('OData-MaxVersion', '4.0');
xhr.setRequestHeader('OData-Version', '4.0');
xhr.setRequestHeader('Accept', 'application/json');
xhr.setRequestHeader('Content-Type', 'application/json; charset=utf-8');
xhr.setRequestHeader('Prefer', 'return=representation');
这给了我一个 400 (bad request)
的 HTTP 代码和这个错误消息:
An undeclared property 'rob_faqid' which only has property annotations in the payload but no property value was found in the payload. In OData, only declared navigation properties and declared named streams can be represented as properties without values.
有趣的是,无论是使用实际的 GUID 还是在其中放置了一些乱码(表明这与传入的值无关),我都会收到此错误。
我可以通过标准表格手动创建记录。
我在同一个项目的其他地方使用 odata.bind
,没有错误。
睡了一觉后我意识到我的错误。要设置查找字段的值,您需要使用关系方案名称,而不是 属性 名称。
一旦我改变了它,一切正常。
如果您想在通过网络创建或更新(新)记录期间设置查找字段的值 API,您必须使用 架构名称或查找的逻辑名称 后跟绑定注释。
- 对于默认字段,如
primarycontactid
,必须使用逻辑名称(屏幕截图的第一列)。 - 对于自定义字段,如
rob_FaqId
,必须使用架构名称(屏幕截图中的第二列)。
var params = {
'rob_FaqId@odata.bind': '/rob_faqs(guid-here)',
'rob_source': 180840000,
'subject': 'Signpost',
'actualstart': new Date(),
'actualend': new Date()
};
解决方案的屏幕截图 > 实体 > 您的实体 > 字段:
因此,通过网络 API 使用已设置的查找字段创建新记录的一般结构是这样的:
{
"logicalorschemaName@odata.bind": "/relatedentitys(guid)" //don't forget the plural 's'
}
或 official documentation 中的另一个示例。如何创建新的客户记录并直接将现有联系人指定为主要联系人。
var newAccountRecordObj = {
"name": "Sample Account",
"primarycontactid@odata.bind": "/contacts(00000000-0000-0000-0000-000000000001)"
}
虽然在这种情况下接受的答案是正确的,但这似乎并不是全部。在某些情况下,有必要使用 <logical name>_<entity name>
。例如,在执行 POST sharepointdocumentlocations
时,我必须使用:
"regardingobjectid_contact@odata.bind": "/contacts(xxxx)"
"parentsiteorlocation_sharepointdocumentlocation@odata.bind" "/sharepointdocumentlocations(xxx)"
这可能与这些关系可以指向不止一种类型的实体这一事实有关,但我还没有找到任何关于它的 Microsoft 文档。