提问人:NoBullMan 提问时间:4/11/2020 最后编辑:NoBullMan 更新时间:4/11/2020 访问量:138
将对象数组从 Ajax 函数传递到 Web 服务
Passing array of object from Ajax function to web service
问:
我有两个相同对象类型的数组,我要将它们传递给 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”的条目,其中包含初始对象集。我认为这对有人提出解决方案有所帮助。
答:
0赞
Evan Ogra
4/11/2020
#1
你是对的,因为这里没有做你想做的事。jQuery不做数组。以下是如何实现一个函数来创建一个新数组,该数组从中排除了所有项目,这些项目也在:$(a).not(b)
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);
评论