我正在尝试将多个表行发布到数据库中。该课程是" PurchaseOrderDetail"我知道我需要反序列化JSON,但我不知道如何使用异步任务IHttpActionResult方法。 错误消息
{" $ id":" 1","消息":"请求无效。"," 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 \ n路由'',第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);
答案 0 :(得分:2)
此错误通常是因为您发布了类似
的内容[{"foo":"bar"}]
什么时候应该发布
{"foo":"bar"}
或修改您的方法以接受您的类的数组:
public async Task<IHttpActionResult> PostNewPurchaseOrderDetail(
[FromBody]IEnumerable<PurchaseOrderDetail> newPurchaseOrderDetails)
{
// ...
确保您发布的JSON采用您期望的格式Fiddler。
您的代码建议您只想发布一个PurchaseOrderDetails
,但您提供的JSON暗示您尝试发布多个。
您需要选择仅发布一个{...}
或修改您的方法,以便它接受许多[{...}, {...}]
,如上所述。