Angular JS, отправляющий данные массива с $resource в .NET API

Да, я знаю, что существует огромное количество сообщений об отправке данных массива с использованием angular $esource. Я прочитал это, это и почти 10 лучших результаты Google по этой теме, но я все еще не могу заставить его работать. Я подозреваю, что это может быть связано с API на стороне сервера, но я действительно не уверен.

Пожалуйста, помогите мне понять это. Я пытаюсь отправить массив данных в .NET API, используя angular $resource.

$ Ресурс:

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 имеет значение null.

Когда я просматривал сообщения stackoverflow по этой теме, я в основном видел, что используется этот синтаксис:

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

Однако это никогда не работает для меня, и полезная нагрузка запроса будет пустым объектом.

Любая помощь будет оценена, так как я абсолютно, ужасно застрял....


person Tina Chen    schedule 12.06.2015    source источник
comment
Как насчет resource.$add({ partId: $scope.part.id, programNames: programsToSave });   -  person devqon    schedule 12.06.2015
comment
возможно, вы можете попробовать с transformRequest и внутри него изменить данные, отправляемые на сервер.   -  person Aleksandar Gajic    schedule 12.06.2015
comment
@devqon, это изменит мой uri на localhost:58248/v1 /parts/109/ и по-прежнему получаю ошибку нулевой ссылки. Но спасибо за ваше предложение ты.   -  person Tina Chen    schedule 12.06.2015
comment
А как насчет resource.$add({ partId: $scope.part.id }, { programNames: programsToSave });   -  person devqon    schedule 12.06.2015
comment
@AlexG, боже мой! Окончательно! Вы спасатель жизни! Будет здорово, если вы опубликуете свой комментарий в качестве ответа, чтобы я мог выбрать вас в качестве решения. Также будет очень полезно, если вы объясните, почему мой массив трансформируется в объект во время запроса.   -  person Tina Chen    schedule 12.06.2015


Ответы (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%, почему angular делает это, но я думаю, что он ожидает, что объект будет передан. поэтому, если у вас есть данные для отправки, такие как {myArray: [...]}, все будет в порядке.

person Aleksandar Gajic    schedule 12.06.2015
comment
да, это именно то, что я сделал. Не то чтобы мне не нравился ваш ответ, но я все еще немного скептически отношусь к этому решению, так как многие люди предположили, что добавление isArray: true является ключевым решением, но это не сработало для меня. Кроме того, я до сих пор не понимаю, почему resource.$add({ }, dataToPost); на самом деле не отправляет никаких данных на сервер, и я должен сделать это так, как сделал -- var r = new Resource(dataToPost); р.$добавить(); - person Tina Chen; 12.06.2015

Вы указываете programNames непосредственно как объект данных, но это должно быть свойство объекта данных:

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

resource.$add({ partId: $scope.part.id }, data);
person devqon    schedule 12.06.2015
comment
Я понимаю. Я думаю, у вас была опечатка в исходном комментарии. Этот метод не работает, а ты. Полезная нагрузка запроса представляет собой пустой объект. - person Tina Chen; 12.06.2015