简体   繁体   中英

$http post not binding with asp.net MVC model

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}

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?

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); }); 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM