在对MVC控制器的POST中,我使用JQuery发送一个带有两个属性的JSON对象:Id和Foos。由于某种原因,每个FooModel实例的所有属性都是null / empty。
以下是方法:
[HttpPost]
public ActionResult EditFoo(int Id, FooModel[] foos)
这是我的fiddler检索表单参数(我可以确认数据正在传递给服务器)。我还用两个调试器验证了JSON对象包含所有正确的值。
Id 17934
Foos[0][Label] My Foo
Foos[0][Bars][0][Label] First Bar
Foos[0][Bars][0][Id] 1
Foos[0][Bars][1][Label] Second Bar
Foos[0][Bars][1][Id] 2
FooModel看起来像这样:
public class FooModel
{
public string Label { get; set; }
public IList<Bar> Bars { get; set; }
}
在EditFoo方法中,我可以看到具有正确数量的Foo项的数组(在本例中为1)。但是,每个FooModel实例中的所有属性都为null / empty。
编辑1:
澄清一下:我不是手工创建表单参数。我通过ajaxArgs.data将一个真正的JSON对象传递回$ .ajax()。
表单数据本身如下所示:
Id=17934&Foos%5B0%5D%5BId%5D=1&&Foos%5B0%5D%5BLabel%5D=My+Foo...
我找不到快速的方法将JSON本身作为字符串,但这是分配给ajaxArgs.data的变量(Foos具有所有属性):
var data = { Id: Model.Id, Foos: Model.Foos };
编辑2:
我正在使用JavaScriptSerializer创建一个如下所示的字符串:
public static string ToJson(this object obj)
{
var serializer = new JavaScriptSerializer();
var foo = serializer.Serialize(obj);
return foo;
}
然后在这个视图中使模型可用于javascript:
<script type="text/javascript">
var Model = <%= Model.ToJson() %>;
</script>
答案 0 :(得分:2)
问题是默认模型绑定器不能理解您显示的请求。您的请求值应如下所示:
Id 17934
Foos[0].Labe My Foo
Foos[0].Bars[0].Label First Bar
Foos[0].Bars[0].Id 1
Foos[0].Bars[1].Label Second Bar
Foos[0].Bars[1].Id 2
或者如果您使用的是ASP.NET MVC 3 JSON请求工厂提供程序,则可以发送如下的JSON请求:
$.ajax({
url: '/foo',
type: 'POST',
data: JSON.stringify({
Id: 17934,
Foos: [
{
Bars: [
{ Label: 'First Bar', Id: 1 },
{ Label: 'Second Bar', Id: 2 }
]
}
]
}),
contentType: 'application/json',
success: function(result) {
alert('success');
}
});
应该发送以下请求:
{ Id: 17934, Foos: [ { Bars: [ { Label: 'First Bar', Id: 1 }, { Label: 'Second Bar', Id: 2 } ] } ] }
答案 1 :(得分:0)
您使用的支架不正确。这样:
Foos[0][Bars][0][Label]
应该是这样的:
Foos[0].Bars[0].Label
此外,这不是JSON,它们是POST参数。