send multiple parameters to asp.net core 3 mvc action using post method

Viewed 5981

There is problem in sending ajax requests that have multiple parameters to asp.net mvc core 3 action using http post method. the parameters do not bind. In dot net framework asp.net web api there was similar limitation but not in asp.net mvc actions. I want to know is there work around this in asp.net core 3 mvc or is this the new limitation? action:

public string SomeAction([FromBody]string param1, [FromBody]IEnumerable<SomeType> param2, [FromBody]IEnumerable<SomeType> param3)
{
       //param1 and param2 and param3 are null
}

client:

    $.ajax({
        contentType: 'application/json',
        data: JSON.stringify({
            "param1": "someString",
            "param2": someList,
            "param3": someList
        }),
        type: "POST",
        dataType: "json",
        url: "/SomeController/SomeAction",
        success: function (result) {
        },
        error: function (error) {
            console.error(error);
        }
    }
    );
3 Answers

With the new version actions need to be explicit about what and where they expected to bind models from.

Create a mode to hold all the required data

public class SomeActionModel {
    public string param1 { get; set; }
    public IEnumerable<SomeType> param2 { get; set; }
    public IEnumerable<SomeType> param3 { get; set; }
}

Update the action to expect the data from the body of the request

public IActionResult SomeAction([FromBody] SomeActionModel model) {
    if(ModelState.IsValid) {
        string param1 = model.param1;
        IEnumerable<SomeType> param2 = model.param2;
        IEnumerable<SomeType> param3 = model.param3;

        //...

        return Ok();
    }

    return BadRequest(ModelState);
}

The client should also send the data in the correct format

var model = {
    param1: GeometricNetworkTrace_Class.flags,
    param2: GeometricNetworkTrace_Class.barriers,
    param3: feederIds
};

$.ajax({
    contentType: 'application/json',
    data: JSON.stringify(model),
    type: "POST",
    dataType: "json",
    url: "/controllerName/actionName",
    success: function (result) {
    },
    error: function (error) {
        console.error(error);
    }
});

Reference Model Binding in ASP.NET Core

Try adding [FromBody] attribute in your controller signature.

public string SomeAction([FromBody] string param1, IEnumerable<SomeType> param2, IEnumerable<SomeType> param3)
{
       //param1 and param2 and param3 are null
}
Related