6

I am trying to pass an array of int but I can not get the value in the webapi method

var postData = { "deletedIds": deletedIds };

    $.ajax({
        type: "DELETE",
        traditional: true,
        dataType: 'json',
        contentType: 'application/json',
        cache: false,
        url: "/api/Management/Models",
        data: JSON.stringify(postData),
        success: ModelDeleted,
        error: ModelNotDeleted
    });

and in apiController :

[HttpDelete]
        public bool DeleteModel(int[] deletedIds)
        {
            return modelsRepository.DeleteModels(deletedIds);
        }
1
  • I tried to remove JSON.stringify but still not working Commented May 4, 2013 at 21:34

3 Answers 3

9

Your code looking pretty Ok to me. Please define structure of "deletedIds" object. one suggestion is to Use new Array() object to initialize deletedIds property and remove JSON.stringify() . A similar question asked here.

EDIT

Web API supports parsing content data in a variety of ways, but it does not deal with multiple posted content values. A solution for your problem could be to create a ViewModel with a property of int[] type. Like code below,

public class SimpleViewModel
{
    public int[] deletedIds{ get; set; }
}

//Controller
[HttpDelete]
    public bool DeleteModel(SimpleViewModel deletedIds)
    {
        return modelsRepository.DeleteModels(deletedIds.deletedIds);
    }

and use it as parameter type.

Sign up to request clarification or add additional context in comments.

5 Comments

I tried to use new Array but still get null on webapi method parameter
Thanks for your reply but the question you referenced is not the same my code is working fine when I use action method in regular controller but when url is to webapi it can not get the data
Use firebug to test post data.
the data is ok on client side but the problem is webapi uses different model binding than mvc
decorating your action parameter with the [FromUri] attribute. this post may help you.
2

At last, based on @Shashank Answer it worked and the code modified as :

var deletedIds = new Array();

deletedIds.push(modelId);

var postData = { "DeletedIds": deletedIds };
$.ajax({
    type: "Delete",
    traditional: true,
    dataType: 'json',
    cache: false,
    url: "/api/Management/Models",
    data: postData,
    success: ModelDeleted,
    error: ModelNotDeleted
});

and the apiController :

[HttpDelete]
        public bool DeleteModels(DeleteViewModel dvm)
        {
            return modelsRepository.DeleteModels(dvm.DeletedIds);
        }

and for the DeleteViewModel :

public class DeleteViewModel
    {
        public int[] DeletedIds { get; set; }
    }

Comments

0

I suspect that the stringify bit is messing up your object - have you tried assigning it to a variable to see if it's the expected formatting?

You're stringifying the whole thing at the moment:

{ "deletedIds": deletedIds }

while what you probably want to send as post body is this:

{ "deletedIds": JSON.stringify(deletedIds) }

5 Comments

And either way, if your controller method expects integers, why stringify them in JS?
stringify was just a try I made up a test action method in a regular controller and it works mvc modelbinder works but webapi not !!
@MuhammadAlaa - post the exact JSON you're sending with the request. Is the controller method hit at all? Are you getting an empty array?
I tried to send static data just for test I get an empty array in the apicontroller method
@Muhammad Alaa - post here the JSON you are sending, static or not, otherwise I can't help you

Your Answer

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.