将Json集合传递给MVC3控制器

时间:2012-12-05 22:37:48

标签: ajax json asp.net-mvc-3

我正在尝试将json“集合”发送到MVC3控制器。在传入的对象是一个数组之前,我已经相当容易地做到了这一点,但在这个例子中没有数组(除非嵌套的{}是'数组'?)

我也尝试了各种模型配置,例如:FormCollectionDictionary<string, FooBar[]>和其他一些配置,但它始终为空。

我做错了什么导致花哨的json-binder-thing无效?

感谢。

构建JSON对象

function getJson() {
    var foobars = {};

    foobars["FooBar1"] = { "Foo": "baz1", "Bar": 1 };
    foobars["FooBar2"] = { "Foo": "baz2", "Bar": 2 };
}

getJson()产生这个Json对象

{
    "FooBar1" : 
    {
        "Foo":"baz1", 
        "Bar":1
    },
    "FooBar2" : 
    {
        "Foo":"baz2", 
        "Bar":2
    }
}

模型

public class FooBarModel
{
    public FooBar[] FooBars { get; set; }
}

public class FooBar
{
    public string Foo { get; set; }
    public int Bar { get; set; }
}

控制器

[HttpPost]
public void ParseFooBars(FooBarModel model)
{
    //model is null
}

jQuery ajax

$.ajax({
    url: "MyController/ParseFooBars",
    data: JSON.stringify(getJson()),
    type: "POST",
    dataType: "json",
    //contentType: "application/json; charset=utf-8",
    contentType: "application/json",
    success: function () {

    },
    error: function () {

    }
});

2 个答案:

答案 0 :(得分:0)

你在json中有“Bar”,在模型中有“Baz”,这是一个错字吗? 如果没有,这可能是映射失败的原因。

另一个原因是默认模型绑定,它可以正常使用IEnumerable&lt;&gt;但我不确定它是否适用于数组。您可能想为FooBarModel尝试自定义模型绑定器。

答案 1 :(得分:0)

第一个问题 - 你确定你正在击中正确的控制器吗?单步调试使用调试器将确认这一点。我没有注意到这一点,多次被咬在后面。

其次,看起来你发送的是字典而不是数组。在您的JSON中,您有一组命名实例,但在您的控制器中,您需要一组未命名的实例。如果您将JSON更改为看起来像这样吗?:

function getJson() {
    var foobars = [];

    foobars.push({ "Foo": "baz1", "Bar": 1 });
    foobars.push({ "Foo": "baz2", "Bar": 2 });
    return foobars;
}