我有一点jquery代码:
//foreach the inputs
json.push({
Var1: $(this).attr("id"),
Var2: filename,
Var3: hash_name
});
//end foreach
$.post(url, {test: json}, function(){}, 'json');
我们假设json有3个对象(在浏览3个输入并获取它们的值之后)。以及MVC3模型中的结构:
public struct Simple
{
public string Var1 {
get;
set;
}
public string Var2{
get;
set;
}
public string Var3{
get;
set;
}
public bool Var4 {
get;
set;
}
}
和控制器:
[HttpPost]
public ActionResult Test( List<Simple> test) {
...
}
List<Simple>
返回3个元素(这里是正确的),但所有属性的值都为null(Var4除外,它是假的)。
为什么?
答案 0 :(得分:1)
名称应该是这样的(Json键值)
test[0].Var1
test[0].Var2
test[0].Var3
test[1].Var1
.....
Or
[0].Var1
[0].Var2
[0].Var3
......
服务器无法关联构成每个对象的属性的想法,因此该数字仅用于分组
和Var4
为false,因为模型绑定器使用其默认值实例化它,它没有从表单中读取任何值
实施例
<强>的Javascript 强>
json.push({
'test[0].Var1': $(this).attr("id"),
'test[0].Var1': filename,
'test[0].Var1': hash_name
});
你应该增加每个对象的0
JavaScript中的名称test
必须与操作方法的参数名称匹配
答案 1 :(得分:1)
如果你想做的是ModelBinding,那么还需要做更多的工作。但是,如果您只是想在服务器端使用json数组,那么这里就是一个快速的黑客攻击。 下载 System.Json (您可以通过NuGet进行)。 在客户端不发送JSON对象,因为这需要一个完全不同的方法。而是在手前将其字符串化
$(document).ready(function () {
var json = [
{
Name: "John Doe",
Age: 34
}];
var str = JSON.stringify(json);
console.log(str);
$.ajax({
url: '/mycontroller/LoadJson',
data: { values: str },
type: 'POST',
success: function (data) {
//do something
}
});
});
在服务器端,您可以将JsonValue.Parse用于动态对象(然后您可以“翻译”到您的一个自定义对象)
[HttpPost]
public ActionResult LoadJson(FormCollection collection)
{
dynamic values = JsonValue.Parse(collection["values"]);
for(int i = 0; i < values.Count; i++)
{
var _output = string.Format("My name is {0} and I'm {1} of age", values[i].Name, values[i].Age);
Console.WriteLine(_output);
}
return RedirectToAction("Index");
}
这是关于动态Json解析的更长篇篇幅 http://www.west-wind.com/weblog/posts/2012/Mar/19/Dynamic-JSON-Parsing-in-NET-with-JsonValue
希望这有帮助