【发布时间】:2014-12-01 15:17:42
【问题描述】:
我正在尝试将多个表行发布到数据库中。该类是“PurchaseOrderDetail”我知道我需要反序列化 JSON,但我不知道如何使用异步任务 IHttpActionResult 方法来做到这一点。 错误信息
{"$id":"1","Message":"请求无效。","ModelState":{"$id":"2","newPurchaseOrderDetail":["无法反序列化当前JSON数组(例如 [1,2,3])转换为类型“TexasExterior.Models.PurchaseOrderDetail”,因为该类型需要 JSON 对象(例如 {\"name\":\"value\"})才能正确反序列化。\r\ n要修复此错误,请将 JSON 更改为 JSON 对象(例如 {\"name\":\"value\"})或将反序列化类型更改为数组或实现集合接口的类型(例如 ICollection、IList)例如可以从 JSON 数组反序列化的 List。也可以将 JsonArrayAttribute 添加到该类型以强制它从 JSON 数组反序列化。\r\nPath '',第 1 行,位置 1。"]}}
ApiController
public async Task<IHttpActionResult> PostNewPurchaseOrderDetail([FromBody]PurchaseOrderDetail newPurchaseOrderDetail)
{
try
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
using (var context = new ApplicationDbContext())
{
context.PurchaseOrderDetails.Add(newPurchaseOrderDetail);
await context.SaveChangesAsync();
return CreatedAtRoute("PurchaseOrderDetailApi", new { newPurchaseOrderDetail.PurchaseOrderDetailId }, newPurchaseOrderDetail);
}
}
catch (Exception ex)
{
return this.BadRequest(ex.Message);
}
}
JSON
[
{
"QBRFQLINESUPPLIERPARTNUMBER": "Panels",
"QBRFQLINESUPPLIERQUOTENOTES": "Notes",
"QBRFQGROUPCOMBINESIZES": 15,
"QBRFQLINESUPPLIERQUOTEQTY": 150,
"QBRFQLINESUPPLIERQUOTEUOM": "ft",
"QBRFQLINESUPPLIERQUOTEUNITPRICE": 1542,
"$$hashKey": "object:96"
},
{
"QBRFQLINESUPPLIERPARTNUMBER": "Carpet",
"QBRFQLINESUPPLIERQUOTENOTES": "Notes",
"QBRFQGROUPCOMBINESIZES": 205,
"QBRFQLINESUPPLIERQUOTEQTY": 845,
"QBRFQLINESUPPLIERQUOTEUOM": "meter",
"QBRFQLINESUPPLIERQUOTEUNITPRICE": 745893,
"$$hashKey": "object:98"
},
{
"QBRFQLINESUPPLIERPARTNUMBER": "Drywall",
"QBRFQLINESUPPLIERQUOTENOTES": "Notes",
"QBRFQGROUPCOMBINESIZES": 19,
"QBRFQLINESUPPLIERQUOTEQTY": 45,
"QBRFQLINESUPPLIERQUOTEUOM": "sheet",
"QBRFQLINESUPPLIERQUOTEUNITPRICE": 8542,
"$$hashKey": "object:100"
}
]
角度
//Post Purchase Order Detail
$scope.newPurchaseOrderDetail = {};
$scope.newPurchaseOrderDetail.PurchaseOrderId = $scope.newPurchaseOrder.PurchaseOrderId;
$scope.newPurchaseOrderDetail.PurchaseOrderDetailId = $scope.newPurchaseOrder.PurchaseOrderId;
$scope.addPurchaseOrderDetail = function () {
var newPurchaseOrderDetail = $scope.newPurchaseOrderDetail;
var index = 0;
$scope.purchaseOrderDetailArray.forEach(function (newPurchaseOrderDetail) {
console.log('purchaseOrderDetailArray #' + (index++) + ': ' + JSON.stringify(newPurchaseOrderDetail));
});
var data = JSON.stringify($scope.purchaseOrderDetailArray)
PurchaseOrderDetailPost.post(data)
.success(function () {
toastr.success('Success!');
}).error(function () {
toastr.error('Error!');
})
};
工厂
app.factory('PurchaseOrderDetailPost', function ($http) {
return {
post: function (data) {
return $http.post('/api/apiPurchaseOrderDetail/', data);
}
};
})
更新
public async Task<IHttpActionResult> PostNewPurchaseOrderDetail([FromBody]IEnumerable<PurchaseOrderDetail> newPurchaseOrderDetail)
{
try
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
using (var context = new ApplicationDbContext())
{
context.PurchaseOrderDetails.AddRange(newPurchaseOrderDetail);
await context.SaveChangesAsync();
return CreatedAtRoute("PurchaseOrderDetailApi", new { newPurchaseOrderDetail.PurchaseOrderDetailId }, newPurchaseOrderDetail);
}
}
catch (Exception ex)
{
return this.BadRequest(ex.Message);
}
}
错误 我知道我关闭了,我不知道如何插入 PurchaseOrderDetailId
return CreatedAtRoute("PurchaseOrderDetailApi", new { newPurchaseOrderDetail.PurchaseOrderDetailId }, newPurchaseOrderDetail);
【问题讨论】:
-
错误的哪一部分你不明白?您希望如何将数组放入该对象参数中?
-
我不明白需要改变什么。我从来没有同时发布多条记录,所以我迷路了
-
要么将单个对象作为您的请求传递,要么更改函数以接受数组或集合。
-
如果您的 json 是
PurchaseOrderDetail对象的序列化数组,则将您的参数更改为IEnumerable<PurchaseOrderDetail>。 -
你能发布你发布的Json吗?
标签: c# json asp.net-web-api2