我正在使用oData和Oracle开发一个带有基于Angular的前端和ASP.NET后端的应用程序。我正试图修补后端的记录。我在控制器的后端使用通用样板代码,补丁方法如下所示:
<AcceptVerbs("PATCH", "MERGE")>
Async Function Patch(<FromODataUri> ByVal key As Decimal, ByVal patchValue As Delta(Of FTP_ORDERS)) As Task(Of IHttpActionResult)
Validate(patchValue.GetEntity())
If Not ModelState.IsValid Then
Return BadRequest(ModelState)
End If
Dim fTP_ORDERS As FTP_ORDERS = Await db.FTP_ORDERS.FindAsync(key)
If IsNothing(fTP_ORDERS) Then
Return NotFound()
End If
patchValue.Patch(fTP_ORDERS)
Try
Await db.SaveChangesAsync()
Catch ex As DbUpdateConcurrencyException
If Not (FTP_ORDERSExists(key)) Then
Return NotFound()
Else
Throw
End If
End Try
Return Updated(fTP_ORDERS)
End Function
在Angular方面,我使用基于资源的服务来发送更新。调用资源的代码如下所示:
(new FTPOrderService({
"key": vm.ID,
"data": vm
}, vm))
.$patch()
.then(function (data) {
alert("Order Saved!");
},
function (error) {
debugger;
}
);
服务定义为:
.factory('FTPOrderService', function ($resource) {
var odataUrl = '../odata/FTP_ORDERS';
var results = $resource('', {}, {
'patch': {
method: 'PATCH',
params: {
key: '@key',
},
url: odataUrl + '(:key)'
}
});
return results;
})
我也尝试过:
(new FTPOrderService({
"key": vm.ID,
}, vm))
.$patch(vm)
.then(function (data) {
alert("Order Saved!");
},
function (error) {
debugger;
}
);
并获得相同的结果。
我相信我已配置angular以正确发送数据:
.config(['$httpProvider', function ($httpProvider) {
$httpProvider.defaults.headers.patch = {
'Content-Type': 'application/json;charset=utf-8'
};
}])
调试器显示我调用URL并在parens中附加了相应的键,请求有效负载如下所示:
{key: "1239990990", data: {loading: false, selectedRow: {}, lineItems: [,…], orderId: "1239990990",…}}
data: {loading: false, selectedRow: {}, lineItems: [,…], orderId: "1239990990",…}
key: "1239990990"
知道我错过了什么?有许多例子使用直接调用$ http.post和一些用于.patch,但没有使用$ resource的当前任何东西。
答案 0 :(得分:1)
我不完全确定这个问题的原因是什么,但在跟踪它时,我确实发现.NET中的补丁方法没有间歇性地接收到一个对象。我传入的对象特别沉重,默认情况下我传递的内容实际上比应用程序的ASP.NET端要求的要重。在修补程序调用之前添加代码以组合满足最低级别要求的对象解决了该问题。