Angular JS使用$ resource向.NET API发送数组数据

时间:2015-06-12 10:29:59

标签: .net angularjs api angular-resource

是的,我知道有很多关于使用angular $ esource发送数组数据的帖子。我阅读了thisthis,以及这个主题的十大谷歌搜索结果,但我仍然无法使其发挥作用。我怀疑它可能与服务器端API有关,但我真的不确定。

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

$ Resouce:

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 });
  }
}

调试器:

request payload

我希望我没有误会这一点,但在我看来,我的阵列变成了一个物体?以数组索引为关键?或者这是数组在请求有效负载中的样子?

.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参数为null。

当我浏览有关此主题的stackoverflow帖子时,我大多看到使用的语法:

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

然而,这对我来说永远不会有效,请求有效负载将是一个空对象。

任何帮助都将受到赞赏,因为我绝对是非常困难....

2 个答案:

答案 0 :(得分:2)

您可以使用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%确定为什么角度会这样做,但我认为它希望对象被传递。所以,如果您发送了像{myArray:[...]}这样的数据,那就没问题了。

答案 1 :(得分:0)

您直接将programNames作为数据对象放入,但它应该是数据对象的属性:

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

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