如何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<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; );
【讨论】:
这不适用于 JObject 作为参数类型。收到此错误:当我点击 CreateCustomers 端点时“无法创建抽象类”以上是关于如何httppost对象列表?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 httppost/rest-api 从 keycloak 获取用户列表