如何将JSON对象数组发布到Web API

19

如何向Web API发布JSON数组?单个对象的情况已经运作正常。

这是我的尝试,但控制器似乎返回了 0 而不是预期的 3

这是我的JSON:

var sc = [{
              "ID": "5",
              "Patient_ID": "271655b8-c64d-4061-86fc-0d990935316a",
              "Table_ID": "Allergy_Trns",
              "Checksum": "-475090533",
              "LastModified": "2015-01-22T20:08:52.013"
          },
          {
              "ID": "5",
              "Patient_ID": "271655b8-c64d-4061-86fc-0d990935316a",
              "Table_ID": "Allergy_Trns",
              "Checksum": "-475090533",
              "LastModified": "2015-01-22T20:08:52.013"
          },
          {
              "ID": "5",
              "Patient_ID": "271655b8-c64d-4061-86fc-0d990935316a",
              "Table_ID": "Allergy_Trns",
              "Checksum": "-475090533",
              "LastModified": "2015-01-22T20:08:52.013"
          }];           

AJAX调用:

$.ajax({
           url: urlString,
           type: 'POST',
           data: sc,
           dataType: 'json',
           crossDomain: true,
           cache: false,
           success: function (data) { console.log(data); }
        });

Web API 控制器:

[HttpPost]
public string PostProducts([FromBody]List<SyncingControl> persons)
{
    return persons.Count.ToString(); // 0, expected 3
}

我不认为这是原因,但你是否尝试在浏览器中使用开发工具来确认有效载荷是否被发送了?我对Web API一无所知,所以也许这不是最可能的原因,但我可以想象某些客户端设置sc等于null,然后再发送请求,这似乎可能会导致这种情况。 - Matthew Haugen
浏览器控制台有任何错误吗?您在sc中的第一个人对象中缺少双引号。 - Joel Gregory
no any error on console - Ranvijay Singh
3个回答

19

JSON 中存在错误,Table_ID": "Allergy_Trns" 应为 "Table_ID": "Allergy_Trns"

缺少双引号。

更新

请确保您按照以下方式将参数发送为 JSON:

 $.ajax({
        url: urlString,
        type: 'POST',
        data: JSON.stringify(sc),
        dataType: 'json',
        contentType: 'application/json',
        crossDomain: true,
        cache: false,
        success: function (data) { console.log(data); }
    });

请注意JSON.stringify(sc),@herbi关于指定内容类型也部分正确。

截图

**截图**


hutchonoid:这里漏掉了,不是我的代码问题,抱歉。 - Ranvijay Singh

2

您需要在ajax请求中添加content-type头部,这样WebAPI才能理解请求并使用正确的格式化程序对数据进行反序列化:

$.ajax({
           url: urlString,
           type: 'POST',
           data: sc,
           dataType: 'json',
           contentType: "application/json",
           crossDomain: true,
           cache: false,
           success: function (data) { console.log(data); }
        });


抱歉,应该是"contentType"而不是"content-Type"。 - Herbi

1
你可以在 beforeSend 中设置 Content-Type,这将确保你的 JSON 数据与服务器对象匹配。
$.ajax({
        beforeSend: function (xhr) {
            xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        },
           url: urlString,
           type: 'POST',
           data: sc,
           dataType: 'json',
           contentType: "application/json",
           crossDomain: true,
           cache: false,
           success: function (data) { console.log(data); }
        });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接