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

Posted

技术标签:

【中文标题】Angular JS将带有$resource的数组数据发送到.NET API【英文标题】:Angular JS Sending Array data with $resource to .NET API 【发布时间】:2015-06-12 10:29:59 【问题描述】:

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

请帮我解决这个问题。我正在尝试使用角度 $resource 将一组数据发布到 .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 参数为空。

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

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

但是,这对我来说永远不起作用,并且请求有效负载将是一个空对象。

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

【问题讨论】:

resource.$add( partId: $scope.part.id, programNames: programsToSave );怎么样 也许您可以尝试使用 transformRequest 并在其中修改发送到服务器的数据。 @devqon,这会将我的 uri 更改为 localhost:58248/v1/parts/109/… 并且仍然出现空引用错误。不过谢谢你的建议。 那么resource.$add( partId: $scope.part.id , programNames: programsToSave ); @AlexG,天哪!最后!你是救生员!如果您可以发表您的评论作为答案,那就太好了,这样我就可以选择您作为解决方案。如果您能解释为什么我的数组在请求期间被转换为对象,那也会很有帮助。 【参考方案1】:

您可以使用 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: [...] 这样的数据就可以了。

【讨论】:

是的,这正是我所做的。并不是说我不喜欢你的回答,但我仍然对这个解决方案有点怀疑,因为很多人建议添加 isArray: true 是关键解决方案,但这对我不起作用。另外,我仍然不明白为什么 resource.$add( , dataToPost);实际上并没有将任何数据发布到服务器,我必须像以前那样做—— var r = new Resource(dataToPost); r.$add();【参考方案2】:

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

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

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

【讨论】:

我明白了。我猜你原来的评论有错字。这种方法对你不起作用。请求负载是一个空对象。

以上是关于Angular JS将带有$resource的数组数据发送到.NET API的主要内容,如果未能解决你的问题,请参考以下文章

angular.js $resources 设置授权头

angular-resource.js encodeUriSegment 问题

如何使用 angular.js-resource 启用 cors 请求

Angular.js $resource 与 ASP.Net webapi?

长数组列表渲染使 Angular.js 中的页面滚动变慢

带有内部数组的Angular2 MatTable数据