MVC - 使用javascript + ajax向Controller发送数组

时间:2012-04-30 16:11:05

标签: asp.net-mvc json

我正在尝试将带坐标的数组发送到MVC控制器 我这样做(不发布所有代码,只发布相关内容):

var coords = [];
..for loop
    coords.push({ X: x, Y: y});
..end of loop

然后我只是用以下对象作为数据进行ajax调用

var data = {
    OtherData: "SomeString",
    OtherData2: 1,
    Coords: coords
};

当我在控制器上调试操作时,其他数据被正确解析 我期望的模型看起来像这样

public class Model
{
    public int OtherData2 { get; set; }
    public string OtherData { get; set; }
    public Point[] Coords { get; set; }
}

我已经尝试过了 - 使用列表 - 使用X和Y作为属性创建一个简单点类 - 将X和Y值作为字符串值发送 - 发送X和Y值连接为1个字符串并接收字符串

列表

在点对象作为数组的情况下,我得到一个具有相同数量的点的列表,但它们都是空的(0,0),而List对象的列表只是null 任何的想法?

也许一个重要的注意事项是我正在使用MVC4

1 个答案:

答案 0 :(得分:0)

看起来DefaultModelBinder不知道如何绑定到List,
(它缺少正确的类型转换器) 你可以做的是为它创建自己的点和类型转换器:

[TypeConverter(typeof(PointTypeConverter))]
public class Point
{
    public int X { get; set; }
    public int Y { get; set; }
}

/// <summary>
/// we need this so we can use the DefaultModelBinder to bind to List<Point>
/// example at http://msdn.microsoft.com/en-us/library/ayybcxe5.aspx
/// </summary>
public class PointTypeConverter : TypeConverter
{
    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
    {
        return true;
    }

    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
    {
        JavaScriptSerializer serializer = new JavaScriptSerializer();
        Point ret = serializer.Deserialize<Point>((string)value);
        return ret;
    }

}

控制器操作如下所示:

[HttpPost]
public ActionResult testPoints(List<Point> cords)
{
    //party
}

和这样的Ajax调用:

$.ajax({
url: "/Home/testPoints/",
type: "POST",
data: {
            //note that i stringify very value in the array by itself
    cords: [JSON.stringify({'X':1,'Y':2}),JSON.stringify({'X':3,'Y':4})]
},
success: function (data)
{
    //client party
}
});

在MVC3中测试了所有这些,并且没有理由它在MVC4中不起作用 希望这有帮助