模型绑定绑定我的json数组,但不绑定值

时间:2012-08-15 16:16:37

标签: c# asp.net asp.net-mvc asp.net-mvc-3 model-binding

我正在使用ASP.NET MVC 3,我正在尝试将简单的json数组绑定到List<JsonPositions>JsonPositions是一个自定义对象,其属性与数组中的json对象相同。

以下是我的数组在客户端上的样子:

var widgetPositions = [
    { col: 5, row: 1, id: 2 },
    { col: 4, row: 5: id: 40 }
];

$.ajax({
    url: 'the url',
    data: { positions: widgetPositions },
    success: function () {
        alert('Save successful.');
    },
    error: function () {
        alert('An error occurred while trying to update the widget positions.');
    }
});

在Chrome中检查请求时,此代码似乎正常工作。

在控制器中,我们有以下操作方法:

public void UpdatePositions(List<JsonPosition> positions)
{
    // debugging here
}

当我检查widgetPositions列表时,它确实有两个项目,就像json数组一样,但是对象的属性与客户端上的对象的值不匹配。这是对象JsonPosition的样子:

public class JsonPosition
{
    public int id { get; set; }
    public int col { get; set; }
    public int row { get; set; }
}

感谢您提供的任何帮助:)

2 个答案:

答案 0 :(得分:3)

我认为您可能需要添加内容类型:

$.ajax({
    url: 'the url',
    data: JSON.stringify({ positions: widgetPositions }),
    contentType: 'application/json',
    success: function () {
        alert('Save successful.');
    },
    error: function () {
        alert('An error occurred while trying to update the widget positions.');
    }
});

此外,您没有指定请求类型,因此默认情况下它会执行GET,您是否要进行POST?这将使它成为

$.ajax({
    url: 'the url',
    type: 'POST',
    data: JSON.stringify({ positions: widgetPositions }),
    contentType: 'application/json',
    success: function () {
        alert('Save successful.');
    },
    error: function () {
        alert('An error occurred while trying to update the widget positions.');
    }
});

答案 1 :(得分:2)

您可以将它们作为JSON对象发送:

var widgetPositions = [
    { col: 5, row: 1, id: 2 },
    { col: 4, row: 5: id: 40 }
];

$.ajax({
    url: 'the url',
    data: JSON.stringify({ positions: widgetPositions }),
    contentType: 'application/json',
    success: function () {
        alert('Save successful.');
    },
    error: function () {
        alert('An error occurred while trying to update the widget positions.');
    }
});

要注意的是,您没有使用代码,哪些代码可以使用:

  • contentType: 'application/json', - 设置正确的请求内容类型标题
  • data: JSON.stringify({ positions: widgetPositions }) - 发送JSON请求

现在,您将很高兴得到您所需要的一切:

public void UpdatePositions(List<JsonPosition> positions)
{
    // debugging here
}

备注:JSON.stringify方法在所有现代浏览器中都是本地定义的(即使在IE8中,即使这远不是现代浏览器)。但是,如果您需要支持一些史前浏览器,您可以在页面中包含json2.js脚本,该脚本将检查浏览器是否本机支持此方法,如果不提供实现。