通过javascript将包含数组的对象数组传递给MVC操作
假设我有一个javascript对象,如:通过javascript将包含数组的对象数组传递给MVC操作,javascript,asp.net-mvc,arrays,stringify,Javascript,Asp.net Mvc,Arrays,Stringify,假设我有一个javascript对象,如: function Parent(n, c) { this.Name = n; this.Children = c; } var p = new Parent("asdf", [1,2,3]); 我想通过JSON将父对象及其子对象的数组传递给MVC4控制器 如何格式化ajax请求?我已经看到了这些,尽管没有一个使用数组作为成员变量 这就是我到目前为止所做的: var parents = []; parents.push(new Par
function Parent(n, c) {
this.Name = n;
this.Children = c;
}
var p = new Parent("asdf", [1,2,3]);
我想通过JSON将父对象及其子对象的数组传递给MVC4控制器
如何格式化ajax请求?我已经看到了这些,尽管没有一个使用数组作为成员变量
这就是我到目前为止所做的:
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) {
...
}
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}]
然后通过以下功能在控制器中取消展平:
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;
}
private IEnumerable解压(IEnumerable参数){
var unzip=newdictionary();
var r=new Regex(@“(.*)\[.\]”);
foreach(参数中的var p)
{
var match=r.match(p.Name.ToString());
如果(匹配成功)
{
var name=match.Groups[1]。值;
如果(!unzip.ContainsKey(名称))
Add(name,new Parent(){name=name,Value=new List(){});
((列表)(解压缩的[name].Value)).Add(p.Value);
}
其他的
添加(p.Name,p);
}
返回解压后的.value;
}
您是否尝试了动态
而不是对象
?这里的问题是,对象
不能固有地转换为IEnumerable
@MichaelPerrenoud,使用动态
提供相同的行为。
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;
}