从Angular接收的ASP.NET oData patchValue为nothing
我正在开发一个应用程序,使用oData和Oracle开发一个基于角度的前端和一个ASP.NET后端。我正试图修补后端的记录。我在控制器的后端使用通用样板代码,补丁方法如下所示:从Angular接收的ASP.NET oData patchValue为nothing,asp.net,angularjs,odata,Asp.net,Angularjs,Odata,我正在开发一个应用程序,使用oData和Oracle开发一个基于角度的前端和一个ASP.NET后端。我正试图修补后端的记录。我在控制器的后端使用通用样板代码,补丁方法如下所示: <AcceptVerbs("PATCH", "MERGE")> Async Function Patch(<FromODataUri> ByVal key As Decimal, ByVal patchValue As Delta(Of FTP_ORDERS)) As Task(Of
<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
(new FTPOrderService({
"key": vm.ID,
"data": vm
}, vm))
.$patch()
.then(function (data) {
alert("Order Saved!");
},
function (error) {
debugger;
}
);
{key: "1239990990", data: {loading: false, selectedRow: {}, lineItems: [,…], orderId: "1239990990",…}}
data: {loading: false, selectedRow: {}, lineItems: [,…], orderId: "1239990990",…}
key: "1239990990"
该服务定义为:
.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中将适当的键附加到URL,请求负载如下所示:
<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
(new FTPOrderService({
"key": vm.ID,
"data": vm
}, vm))
.$patch()
.then(function (data) {
alert("Order Saved!");
},
function (error) {
debugger;
}
);
{key: "1239990990", data: {loading: false, selectedRow: {}, lineItems: [,…], orderId: "1239990990",…}}
data: {loading: false, selectedRow: {}, lineItems: [,…], orderId: "1239990990",…}
key: "1239990990"
你知道我错过了什么吗?有许多例子使用直接调用$http.post和一些for.patch,但没有任何当前使用$resource的例子 我不完全确定这个问题的原因是什么,但在跟踪过程中,我确实发现.NET中的补丁方法间歇性地没有接收到对象。我传递的对象特别重,默认情况下我传递的对象实际上比应用程序的ASP.NET端需要的对象重。在补丁调用之前添加代码以组装满足最低级别要求的对象解决了问题 我已经弄明白了这一点,并将发布答案RSN。基本上,我通过补丁发送的对象似乎不必要地复杂,并且将其细化到最低限度似乎可以解决这个问题。