如何httppost对象列表?

Posted

技术标签:

【中文标题】如何httppost对象列表?【英文标题】:How to httppost a list of objects? 【发布时间】:2018-07-18 07:23:35 【问题描述】:

我有我需要从我的 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(Customer c) 并且它按预期工作。但是当我使用列表时,它总是在另一边显示为 null。

编辑: $.ajax 有效,但 $http.post 无效。知道为什么吗?

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

【问题讨论】:

好的,我会尽快检查的。 你能检查一下吗:$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】:

您发送的是 JSON(包括 dataType: 'json')

$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、文本等。

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

【讨论】:

还是不行 :( 相关代码我都贴出来了,能再看看吗?【参考方案2】:

在参数前使用[ModelBinder]

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

Web API 仅对简单类型使用模型绑定,其他一切都依赖格式化程序。添加 [ModelBinder] 会强制复杂类型使用模型绑定。

【讨论】:

【参考方案3】:

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

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

【讨论】:

这不适用于 JObject 作为参数类型。收到此错误:当我点击 CreateCustomers 端点时“无法创建抽象类”

以上是关于如何httppost对象列表?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 httppost/rest-api 从 keycloak 获取用户列表

如何使用 HttpPost 方法从 Ok(对象值)中获取值

为啥在我的 HttpPost 方法 Ajax 调用中,控制器上的参数为空?

编辑带有子实体选择列表框和 HTTPPost 困难的视图

如何使用HttpClient

在 ASP.NET Core 2.1 中将 json 数据列表传递给 HttpPost 控制器