2011-02-10 43 views
1

在一个MVC控制器的POST中,我使用JQuery发送一个具有两个属性的JSON对象:Id和Foos。出于某种原因,每个FooModel实例的所有属性都是空/空的。asp.net mvc json解串器不工作

这里的方法:

[HttpPost] 
public ActionResult EditFoo(int Id, FooModel[] foos) 

这是我的小提琴手,获取表单参数(我可以证实,该数据被传递到服务器)。我还用两个调试器验证了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方法,我可以看到的富项目的权限编号的数组(在该例子中,1)。但是,每个FooModel实例中的所有属性都是空/空的。

编辑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> 

回答

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

您使用括号不正确。这:

Foos[0][Bars][0][Label] 

应该是这样的:

Foos[0].Bars[0].Label 

而且,这不是JSON,他们是表单POST参数。

+0

这就是Fiddler如何表示参数。我会得到一个JSON示例 – 2011-02-10 21:50:14

+0

@c_bit,是的,我确信这就是Fiddler代表他们的方式,但也是因为这是他们被传送过来的方式。 jQuery允许您使用各种机制通过AJAX发送数据,包括POST *和* JSON两种形式。您明确使用表单POST变体,并且对于ASP.NET MVC模型联编程序,名称/值对的**名称**部分格式不正确。 – 2011-02-10 21:52:08