从Angular接收的ASP.NET oData patchValue为nothing

从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

我正在开发一个应用程序,使用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 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。基本上,我通过补丁发送的对象似乎不必要地复杂,并且将其细化到最低限度似乎可以解决这个问题。