【问题标题】:Pass array of objects containing arrays to MVC action via javascript通过 javascript 将包含数组的对象数组传递给 MVC 操作
【发布时间】:2013-11-29 19:27:06
【问题描述】:

假设我有一个 javascript 对象,例如:

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

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

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

我将如何格式化 ajax 请求?我见过quiteafewotherquestions 沿着这些路线,尽管没有使用数组作为成员变量。

这是我目前所拥有的:

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]}]}"

这是控制器动作:

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

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

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

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

简单的数据类型似乎以这种方式工作得很好(日期、整数、字符串等),但 Children 数组只是以 {object} 的形式出现,据我所知,这甚至不是字符串,但是一些通用的 System object。有没有办法在 MVC 中做到这一点而无需诉诸,例如,将其推入字符串并解析出来?

【问题讨论】:

  • 你试过dynamic而不是object吗?这里的问题是object 本身不能转换为IEnumerable
  • @MichaelPerrenoud 使用 dynamic 会产生相同的行为。

标签: javascript asp.net-mvc arrays stringify


【解决方案1】:

目前,我已经决定通过 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}]

然后通过以下函数在控制器中取消展平:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-21
    • 2016-07-11
    • 1970-01-01
    • 1970-01-01
    • 2014-11-11
    • 2021-04-14
    相关资源
    最近更新 更多