【问题标题】:'An undeclared property' when trying to create record via Web API尝试通过 Web API 创建记录时出现“未声明的属性”
【发布时间】:2017-10-13 16:41:37
【问题描述】:

我收到一个似乎无法调试的错误。我正在尝试通过自定义 HTML/JavaScript Web 资源创建自定义活动实体。

用户点击一个按钮和以下参数:

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/

带有以下标题:

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,没有任何错误。

【问题讨论】:

  • 似乎无法识别您发送的值,因为它被标识为空白。服务期望的格式是什么?

标签: javascript asp.net-web-api microsoft-dynamics dynamics-crm-online dynamics-365


【解决方案1】:

睡了一夜好觉后,我意识到自己的错误。要设置查阅字段的值,您需要使用关系方案名称,而不是属性名称。

一旦我改变了它,一切都很好。

【讨论】:

    【解决方案2】:

    当您想在通过 Web 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()
    };
    

    解决方案的屏幕截图 > 实体 > 您的实体 > 字段:

    因此,通过 Web 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)"
    }
    

    【讨论】:

      【解决方案3】:

      虽然在这种情况下接受的答案是正确的,但这似乎并不是全部。在某些情况下,有必要使用<logical name>_<entity name>。例如在做POST sharepointdocumentlocations 时,我不得不使用:

      "regardingobjectid_contact@odata.bind": "/contacts(xxxx)"
      "parentsiteorlocation_sharepointdocumentlocation@odata.bind" "/sharepointdocumentlocations(xxx)"
      

      这可能与这些关系可以指向不止一种类型的实体有关,但我没有找到任何关于它的 Microsoft 文档。

      【讨论】:

        猜你喜欢
        • 2018-07-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-19
        • 2018-11-14
        • 2021-06-17
        • 1970-01-01
        相关资源
        最近更新 更多