Angular JS 将带有 $resource 的数组数据发送到 .NET API

Angular JS Sending Array data with $resource to .NET API

是的,我知道有大量关于使用 angular $esource 发送数组数据的帖子。我阅读了 this, this,几乎是关于该主题的前 10 google 个结果,但我仍然无法让它发挥作用。我怀疑这可能与服务器端有关API,但我真的不确定。

请帮我解决这个问题。我正在尝试使用 angular $resource POST 一个数据数组到 .NET API。

$资源:

ResourceModule.service('PartProgramsResource', function ($resource) {
     var url = _baseUrl + '/parts/:partId/programs'
     return $resource(url, { partId: '@partId' }, {
         add: {method: 'POST', isArray: true}
     });

})

内部控制器:

app.controller("EditPartCtrl", function ($scope, PartProgramsResource){
   $scope.save = function(){
      var programsToSave = ["program 1", "program2"];
      var resource = new PartProgramsResource(programsToSave);
      resource.$add({ partId: $scope.part.id });
  }
}

调试器:

我希望我没有弄错,但在我看来我的数组变成了一个对象??以数组索引为键?或者这是数组在请求有效负载中的样子?

.NET API:

 [HttpPost]
    [Route("{partId:int:min(1)}/programs"
        , Name = ApplicationApiRoutes.Parts.AddPartPrograms)]
    [ResponseType(typeof(IEnumerable<KeyValueOutput>))]
    public HttpResponseMessage AddPartPrograms([FromUri] int partId, [FromBody] List<string> programNames)
    {
        return Execute(() => _partFacade.AddPartPrograms(partId, programNames.ToArray(), CurrentUser));
    }

使用上述资源调用 API 将导致 System.NullReferenceException 错误。 programNames 参数为空。

当我浏览有关此主题的 Whosebug 帖子时,我主要看到正在使用以下语法:

var resource = new PartProgramsResource();
 resource.$add({ partId: $scope.part.id }, programsToSave);

但是,这对我不起作用,请求有效负载将是一个空对象。

任何帮助将不胜感激,因为我绝对非常卡住....

你直接把programNames作为数据对象,但应该是数据对象的属性:

var resource = new PartProgramsResource(),
    data = {
        programNames: programsToSave
    };

resource.$add({ partId: $scope.part.id }, data);

您可以使用 transformRequest 修改数据

ResourceModule.service('PartProgramsResource', function ($resource) {
    var url = _baseUrl + '/parts/:partId/programs'
    return $resource(url, { partId: '@partId' }, {
        add: {
            method: 'POST',
            transformRequest: function (data, headersGetter) {
                //modify data and return it 
                return angular.toJson(data);
            },
            isArray: true
        }
    });
})

我不是 100% 确定为什么 angular 这样做,但我认为它期望对象被传递。所以如果你发送了像 {myArray: [...]} 这样的数据就没问题了。