如何httppost对象列表?

时间:2018-02-07 21:15:58

标签: javascript c# angularjs asp.net-web-api

我有这个对象列表,我需要从我的angularjs javascript代码发送:

var dataToSend = [{
                    SubId: "c9cb1d3e-8c32-4a9e-8f0d-0008196776de",
                    CustomerName: "Blah"
                }, {
                    SubId: "aaaa1d3e-8c32-4a9e-8f0d-0008196776de",
                    CustomerName: "Blah2"
                }]

我尝试过这些不同的变体,但它们都没有起作用:

1

$http.post("url",
                {
                    dataType: 'json',
                    headers: {
                       contentType: "application/json; charset=utf-8",
                    },
                    method: "POST",
                    data: dataToSend,
                }).then...

2

$http.post("url",
                    {
                        data: $.param(dataToSend),
                    }).then...

3

$http.post("url",
                        {
                            data: angular.toJson(dataToSend),
                        }).then...

4

$http.post("url",
                        {
                            data: { customers: dataToSend },
                        }).then...

5

$http.post("url",
                        {
                            data: JSON.stringify({ customers: dataToSend }),
                        }).then...

我的API端代码是(我已尝试使用[FromBody]属性,但没有运气):

        [HttpPost]
        public async Task<JsonResult> CreateCustomers(List<Customer> customers)
        {
              // customers is always null
        }

这是我的Customer.cs:

public partial class Customer
    {
        public System.Guid SubId { get; set; }
        public string CustomerName { get; set; }
    }
你能帮帮我吗?我已经尝试过发布到CreateCustomers(客户c)而不使用列表并且它按预期工作。但是当我使用一个列表时,它总是在另一边变为空。

编辑: $ .ajax正在运行但$ http.post不是。知道为什么吗?

var request = $.ajax({
                dataType: "json",
                url: "url",
                method: "POST",
                data: { '': dataToSend }});

3 个答案:

答案 0 :(得分:0)

您的帖子数据与参数List<Customer>不匹配。 将服务器端方法更改为:

[HttpPost]
public async Task<JsonResult> CreateCustomers(JObject queryParam)
{
    // populate your list here
    // for eaxample : var customers = queryParam["customers"].ToString();
}

此外,您还可以使用此代码将数据发送到服务器:

$http({
    url: 'url',
    dataType: 'json',
    method: 'POST',
    data: jsonData,
    headers: { "Content-Type": "application/json" }
}).success(function(response){ $scope.response = response;
}).error(function(error){ $scope.error = error; });

答案 1 :(得分:0)

您是否正在发送JSON(包括数据类型:&#39; json&#39;)

$http({  
            url: "url",  
            dataType: 'json',  
            method: 'POST',  
            data: dataToSend,  
            headers: {  
               contentType: "application/json; charset=utf-8",
            }  
         })

在C#中,在参数

中添加FromBody
[HttpPost]
        public async Task<JsonResult> CreateCustomers([FromBody]]List<Customer> customers)
        {
              // customers is always null
        }

有关Ajax参数的更多信息

contentType 是您要发送的数据类型,因此application / json; charset = utf-8是常见的,就像application / x-www-form-urlencoded一样; charset = UTF-8,这是默认值。

dataType 是您期望从服务器返回的内容:json,html,text等。

这应该有效。如果您遇到问题,请发布完整代码

答案 2 :(得分:0)

在你的参数前面使用[ModelBinder]

    [HttpPost]
    public async Task<JsonResult> CreateCustomers([ModelBinder]List<Customer> customers)
    {
          // customers is always null
    }

Web API仅对简单类型使用模型绑定,而对其他所有内容都使用格式化程序。添加[ModelBinder]会强制复杂类型无论如何都要使用模型绑定。