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

Posted

技术标签:

【中文标题】将对象数组从 Ajax 函数传递到 Web 服务【英文标题】:Passing array of object from Ajax function to web service 【发布时间】:2020-07-23 20:09:37 【问题描述】:

我有两个相同对象类型的数组,我将它们传递给 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 调用将这两个数组传递给网络服务。它们都有对象:

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

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

【问题讨论】:

【参考方案1】:

你是对的,$(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);

【讨论】:

以上是关于将对象数组从 Ajax 函数传递到 Web 服务的主要内容,如果未能解决你的问题,请参考以下文章

使用 jQuery.ajax 发布函数将 javascript 数组中的数据传递到服务器?

Ajax 调用将字符串传递给 Web 服务并返回 String[]

将对象数组从 js 传递到 rails

将对象数组从 PLSQL 传递到 Java 函数时出错

通过 JSON 对象将 Session 对象中的字节数组传递给 Web 服务(Asp.Net 2.0 asmx)

jq ajax传递json对象到服务端及contentType的用法