将对象的数组从Ajax函数传递到Web服务

问题描述 投票:0回答:1

我有两个要传递给Web服务API的相同对象类型的数组。我先看一下数组,然后再将其传递给Web服务,并且每个数组中都有一个对象。我在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调用将这两个数组传递给Web服务。它们都有对象:

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

Web服务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”操作产生的数组上。

此外,当我检查“,not”操作的结果时,我注意到它不仅在两个数组之间有区别,而且还包含一个包含初始对象集的名为“ prevObject”的条目。我希望这对有人提出解决方案有所帮助。

javascript c# jquery web-services parameter-passing
1个回答
0
投票

您是正确的,因为$(a).not(b)在这里没有执行您想要的操作。 jQuery的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);
© www.soinside.com 2019 - 2024. All rights reserved.