asp.net mvc json deserializer无法正常工作

时间:2011-02-10 21:41:48

标签: asp.net-mvc

在对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>

2 个答案:

答案 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参数。