Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ASP.Net Core 3 Posting JSON array to controller

I´m having issues passing an array of JSON objects to an MVC controller in ASP.Net core 3. The JSON object is built from a CSV file and passed through an AJAX call. The correct action is called but the object received is always null.

JS:

async function updateData(){
    var obj = await getData();
    $.ajax({
        type: "POST",
        contentType: "application/json",
        url: "/admin/metric/Update",
        data: obj,
        dataType: 'json',
        success: function (data) {
            console.log("SUCCESS : ", data);
        },
        error: function (e) {
            console.log("ERROR : ", e);
        }
    });
}

async function getData(){
    var metric = {};
    var metrics = [];

    var response = await fetch('https://bloburi.net/source/file.csv');
    var data = await response.text();
    var table = data.split('\n').slice(1);
    table.forEach(row => {
        var columns = row.split(',');
        metric["FirstName"] = columns[0];
        metric["LastName"] = columns[1];
        metric["Email"] = columns[2];
        metric["AverageHandleTime"] = columns[3];
        metric["AverageFollowUp"] = columns[4];
        metric["AverageHold"] = columns[5];
        metric["Date"] = columns[6];
        metrics.push(JSON.stringify(metric));
    });

    console.log(metrics);
    return metrics;
}

Models:

public class MetricBase
    {
        [Required]
        public string Date { get; set; }
        public double AverageHandleTime { get; set; }
        public double AverageHold { get; set; }
        public double AverageFollowUp { get; set; }
        public string Email { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }

public class MetricModel
    {
        public IEnumerable<MetricBase> MetricBase { get; set; }
    }

Controller:

[HttpPost]
public IActionResult Update([FromBody]MetricModel obj)
{
    return Json(new { obj });
}

I think the issue may be on how I'm deffining the class that is receiving the JSON, but I've tried multiple things like deffining MetricBase as a List<> or straight up as an array in MetricModel, but it doesn't seem to work.

Any help is appreciated!

like image 827
Gabriel Ochoa Gonzalez Avatar asked Mar 04 '23 03:03

Gabriel Ochoa Gonzalez


1 Answers

You adding the stringify item inside array via code

metrics.push(JSON.stringify(metric));

instead of stringify the whole array. Change the line to

metrics.push(metric);

and data: obj, to

data: JSON.stringify(obj),.

With the mentioned change, the $.ajax sends the whole array. Also change the action to

public IActionResult Update([FromBody]IEnumerable<MetricBase> obj)

like image 199
user1672994 Avatar answered Mar 07 '23 02:03

user1672994