Передача массива объекта из функции Ajax в веб-сервис - PullRequest
1 голос
/ 11 апреля 2020

У меня есть два массива одного типа объектов, которые я передаю API веб-службы. Я смотрю на массив непосредственно перед его передачей в веб-службу, и у каждого есть объект в нем. Я поставил точку останова в API, и список пуст. Не могу понять, что я делаю неправильно.

Я определил DTO как:

public class AdminDTO
{
    public string fn { get; set; }
    public string mi { get; set; }
    public string ln { get; set; }
    public string email { get; set; }
    public string userid{ get; set; }
}

в функции JS. Я заполняю два массива так:

// this is done inside a foreach loop
var fn = userData.FirstName;
var mi = userData.Initial;
var ln = userData.LastName;
var email = userData.Email;
var userid = userData.UserID;

//push the object onto the array
admins.push({
    "fn": fn,
    "mi": mi,
    "ln": ln,
    "email": email,
    "userid": userid
});
...
...
// clone admin list for later comparison
currAdmins = admins.slice(0);

В какой-то момент «администраторы» изменяются посредством взаимодействия с пользователем. Некоторые объекты удалены, а некоторые добавлены новые. Я использую ниже, чтобы получить два новых массива для хранения различий между "admins" и "currAdmins":

var adminsChanged = $(admins).not(currAdmins).length > 0 || $(currAdmins).not(admins).length > 0;
var adminsToAdd = [];
var adminsToRemove = [];

if (adminsChanged) {
    adminsToAdd = $(admins).not(currAdmins);
    adminsToRemove = $(currAdmins).not(admins);
}
...
// "newMapping" is a mapping of another DTO called "projctDTO", this is passed correctly to web service
doUpdate(newMapping, "projDTO", adminsToRemove, adminsToAdd);;

Теперь я пытаюсь передать эти два массива в веб-службу с помощью вызова ajax. У них обоих есть объекты:

function doUpdate(mapping, jsonObjName, adminsToAdd, adminsToRemove) {debugger
    $.ajax({
        url: "../WebService/Blah.asmx/updateSomething",
        type: "POST",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        data: "{" + jsonObjName + ":" + JSON.stringify(mapping) + ", adminRemoveDTO: " + JSON.stringify(adminsToRemove) + ", adminAddDTO:" + JSON.stringify(adminsToAdd) + " }",
    }).done(function (result) {debugger
    ...
    });

API веб-службы:

public string UpdateSomething(ProjectDTO projDTO, List<AdminDTO> adminRemoveDTO, List<AdminDTO> adminAddDTO)
{
    // projDTO has stuff in it but both lists are empty
    ....
}

Я также попытался вызвать функцию ajax и настроить данные ajax, как это, но не сделал работа:

doUpdate(newMapping, "projDTO", adminsToRemove, "adminRemoveDTO", adminsToAdd, "adminAddDTO");
...

function doUpdate(mapping, jsonObjName, adminsToAdd, jsonObjNameAR, adminsToRemove, jsonObjNameAA) {debugger
    $.ajax({
        url: "../WebService/AIR.asmx/updateProject",
        type: "POST",
        contentType: "application/json; charset=utf-8",
        dataType: "json",

        data: "{" + jsonObjName + ":" + JSON.stringify(mapping) + ", " + jsonObjNameAR + ":" + JSON.stringify(adminsToRemove) + ", " + jsonObjNameAA + ":" + JSON.stringify(adminsToAdd) + " }",

Обновление

Для целей тестирования вместо использования массива, который (предположительно) содержит различия для передачи в качестве параметров, я использовал исходные массивы : admins и currAdmins, и это сработало. Это говорит о том, что проблема связана с массивом, полученным в результате операции «.not».

Кроме того, когда я исследовал результат операции «не», я заметил, что не только он имеет разницу между двумя массивами, но и также запись с именем «prevObject», которая содержит начальный набор объектов. Мне кажется, это помогает кому-то, кто предлагает решение.

1 Ответ

0 голосов
/ 11 апреля 2020

Вы правы в том, что $(a).not(b) не делает то, что вы хотите здесь. jQuery s not не делает массивов. Вот как вы можете реализовать функцию для создания нового массива, который исключает все элементы из a, которые также находятся в b:

function filterNotIn(a, b, keySelector) {
  const keysFromB = new Set(b.map(keySelector));
  return a.filter(item => !keysFromB.has(keySelector(item)));
}

adminsToAdd = filterNotIn(admins, currAdmins, admin => admin.userid);
...