我正在尝试将带坐标的数组发送到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
答案 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中不起作用 希望这有帮助