19

How can I post a JSON array to a Web API? It's working for single object.

This is what I've tried, but the controller seems to be returning 0 rather than the expected 3.

This is my 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 call:

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

Web API controller:

[HttpPost]
public string PostProducts([FromBody]List<SyncingControl> persons)
{
 return persons.Count.ToString(); // 0, expected 3
}
hutchonoid
33.4k15 gold badges101 silver badges106 bronze badges
asked Jan 23, 2015 at 9:37
3
  • I don't imagine this is it, but have you tried using dev tools in the browser to just confirm that the payload is even being sent? I know nothing about Web API so perhaps this isn't the most likely cause, but I can imagine something client-side setting sc equal to null before the request gets fired off, which seems like it could do this. Commented Jan 23, 2015 at 9:46
  • Any errors in the browser console? You are missing a double quote in the first person object in sc. Commented Jan 23, 2015 at 9:53
  • no any error on console Commented Jan 23, 2015 at 9:59

3 Answers 3

19

There is an error in the json Table_ID": "Allergy_Trns" should be "Table_ID": "Allergy_Trns".

Missing double quote.

Update

You need to make sure that you are sending your parameters as json as follows:

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

Notice the JSON.stringify(sc), @herbi is partly correct too about specifying a content type.

Screen grab

**Screen grab**

answered Jan 23, 2015 at 9:52
1
  • hutchonoid: its missed here not in my code sorry for that. Commented Jan 23, 2015 at 9:54
2

You have to add the content-type header to the ajax request, so that WebAPI is able to understand the request and use the correct formatter to deserialize the data:

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

answered Jan 23, 2015 at 10:08
1
  • sorry, it is "contentType", not "content-Type" Commented Jan 23, 2015 at 10:31
1

You can set the Content-Type on beforeSend which will insure that your json data matches with your server object

$.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); }
 });
fthiella
49.2k15 gold badges96 silver badges108 bronze badges
answered Jan 8, 2016 at 13:34

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.