gpt4 book ai didi

javascript - 通过javascript将包含数组的对象数组传递给MVC Action

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:44:54 24 4
gpt4 key购买 nike

假设我有一个像这样的 javascript 对象:

function Parent(n, c) {
this.Name = n;
this.Children = c;
}

var p = new Parent("asdf", [1,2,3]);

我想通过 JSON 将 parent 对象及其子对象的数组传递给 MVC 4 Controller 。

我将如何格式化 ajax 请求?我看过quite a few other questions沿着这些思路,尽管没有一个使用数组作为成员变量。

这是我目前所拥有的:

var parents = [];
parents.push(new Parent("qwer", "child1"));
parents.push(new Parent("sdfg", 12345));
parents.push(new Parent("zxcv", [4,5,6]));

$.ajax({
url: MakeUrl("Ctlr/Action"),
type: "POST",
contentType: 'application/json;charset=utf-8',
data: JSON.stringify({
parents : parents
}),
success: function (data, state, xhr) {
$("#someDiv").html(data);
},
error: function (xhr, state, err) {
Utility.displayError(xhr.reponseText);
}
});

stringify 的结果实际上看起来很合理:

"{"parents":[{"Name":"qwer","Value":"child1"}, {"Name":"sdfg","Value":12345}, {"Name":"zxcv","Value":[4,5,6]}]}"

这是 Controller 操作:

public ActionResult Action(IEnumerable<Parent> parents) {
...
}

如果相关,服务器端 Parent 对象:

public class Parent {
public string Name { get; set; }
public object Children { get; set; }
}

Children 是一个 object 因为它有时是另一种数据类型 - 我意识到这可能有点代码味,但这个类的最终功能是通过我们报告引擎的任意参数。

简单的数据类型似乎以这种方式工作得很好(日期、整数、字符串等),但是 Children 数组只是作为 {object} ,据我所知这甚至不是一个字符串,而是一些通用的系统对象。有没有一种方法可以在 MVC 中执行此操作,而无需求助于将其插入字符串并将其解析出来?

最佳答案

目前,我已经决定通过 javascript 提交一个平面列表,然后在服务器端构建。

JavaScript:

var parents = [];
parents.push(new Parent("asdf", "qwer"));
parents.push(new Parent("zxcv", 123456));

[4,5,].forEach(function (e, i) {
params.push(new Parent("Children[" + i + "]", e));
});

JSON.stringify 之后看起来像这样:

[{"Name":"asdf","Value":"qwer"},{"Name":"zxcv","Value":123456},{"Name":"Children[0]","Value":4},{"Name":"Children[1]","Value":5},{"Name":"Children[2]","Value":6}]

然后通过以下函数在 Controller 中取消展平:

private IEnumerable<Parent> Unzip(IEnumerable<Parent> parameters) {
var unzipped = new Dictionary<string, Parent>();
var r = new Regex(@"(.*)\[.*\]");

foreach (var p in parameters)
{
var match = r.Match(p.Name.ToString());
if (match.Success)
{
var name = match.Groups[1].Value;
if (!unzipped.ContainsKey(name))
unzipped.Add(name, new Parent() { Name = name, Value = new List<object>() { } });

((List<object>)(unzipped[name].Value)).Add(p.Value);
}
else
unzipped.Add(p.Name, p);
}

return unzipped.Values;
}

关于javascript - 通过javascript将包含数组的对象数组传递给MVC Action ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20292284/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com