6

Why is the payload from a angularjs $http post not beeing binded to the input model?

When the action is called the model is null and the request.params and request.forms does not show any sign of a form beeing sent. But the fiddler request shows that the payload is beeing sent with JSON.

AngularJS:

$http({
            method: "POST",
            url: "price/add",
            data: {
                Id: $scope.id,
                StoreId: $scope.storeid,
                Name: $scope.name,
                Manufacturer: $scope.manufacturer,
                Price: $scope.price
            }
        })

Model:

public class PriceModel
    {
        public int? Id { get; set; }
        public int? StoreId { get; set; }
        public string Barcode { get; set; }
        public string Name { get; set; }
        public string Manufacturer { get; set; }
        public DateTime Created { get; set; }
        public double? Price { get; set; }
    }

controller and action method description

public class PriceController : Controller
    {
        [HttpPost]
        public int Add(PriceModel price)
        {

Fiddler:

POST http://localhost:4989/price/add HTTP/1.1
Host: localhost:4989
Connection: keep-alive
Content-Length: 70
Accept: application/json, text/plain, */*
Origin: http://localhost:4989
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.146 Safari/537.36
Content-Type: application/json;charset=UTF-8
Referer: http://localhost:4989/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: nb,no;q=0.8,en-US;q=0.6,en;q=0.4

{"id":"","storeid":"","name":"asdf","manufacturer":"asdf","price":123}
2
  • 4
    I'm not sure if model binding is confused because the parameter is named price and your have a property in the PriceModel also called Price. Can you try renaming the action parameter name? Commented Mar 13, 2014 at 21:14
  • you are right! post the answer and get your reward :) Commented Mar 13, 2014 at 21:17

2 Answers 2

12

I'm not sure if model binding is confused because the parameter is named price and you have a property in the PriceModel that's also called Price. Can you try renaming the action parameter name?

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

2 Comments

renaming the paramenter name worked a charm! i changed the name from price to model and it worked. Never knew!
Everything else seemed correct and that was the only thing that seems suspicious. Glad it helped!
0

Just to save another person an hour, one general cause for this problem is when we use

http({
        url: url,
        method: 'POST',
        params: argument,
        headers: {
            'X-Requested-With': 'XMLHttpRequest'
        }
    }).success(function (data) {
        defered.resolve(data);
    }).error(function (data, status) {
        defered.reject(data);
    });

However if we change to the following works like a charm:

http.post(
            url,
            argument
        ).success(function (data) {
            defered.resolve(data);
        }).error(function (data, status) {
            defered.reject(data);
        });

Comments

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.