0

我正在尝试将带有坐标的数组发送到 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 作为属性创建一个类 Simple Point - 将 X 和 Y 值作为字符串值发送 - 将 X 和 Y 值连接为 1 个字符串并接收字符串列表

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

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

4

1 回答 1

0

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

[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 中不起作用希望这会有所帮助

于 2012-05-01T11:01:45.630 回答