У меня есть два массива одного типа объектов, которые я передаю 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», которая содержит начальный набор объектов. Мне кажется, это помогает кому-то, кто предлагает решение.