我有一个JavaScript变量,它基本上是一个边界框数组(称为bounds
)。每个数组元素的形式为:
{
XHigh: -71.00742992911023,
XLow: -71.00670274612378,
YHigh: 42.09467040703646,
YLow: 42.09458047487587
}
我正试图通过POST将其发送到一个动作方法:
$.ajax({
url: '/Map/GetLocations',
type: 'POST',
data: { boxes: bounds },
success: function(data) {
// doing something with the result
}
});
在服务器上,我将数据消费到action方法中:
[HttpPost]
public ActionResult GetLocations(IList<BoundingBox> boxes)
{
// do something with boxes and return some json
}
将DTO类定义为:
public class BoundingBox
{
public decimal XHigh { get; set; }
public decimal XLow { get; set; }
public decimal YHigh { get; set; }
public decimal YLow { get; set; }
}
在action方法中,boxes
值确实包含我在POST中发送的正确数量的元素。但是,所有十进制值都是0.我尝试将它们更改为DTO中的double
,仍为0.0。我尝试将它们更改为string
并且它们是空的。
我是否在模型绑定中遗漏了如何填充这些值的内容?如何将此数组对象发送到我的操作方法?
答案 0 :(得分:1)
我为这个问题写了一个小帮手,因为我还遇到了你问题的一些变化。我通过向服务器发送序列化版本的JS对象来解决这些问题(使用JSON.stringify()
)并让MVC在运行中反序列化它。
我写的第一堂课是JsonParameterAttribute
。它指示MVC在绑定装饰参数时使用我的TypedJsonBinder
。
public class JsonParameterAttribute : CustomModelBinderAttribute
{
public override IModelBinder GetBinder()
{
return new TypedJsonBinder();
}
}
TypedJsonBinder
将修饰参数的值作为字符串,并尝试在我的情况下使用Json.NET库将其反序列化为参数的类型。 (当然,您可以使用其他反序列化技术。)
public class TypedJsonBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
try
{
var json = (string) bindingContext.ValueProvider.GetValue(bindingContext.ModelName).ConvertTo(typeof (string));
return JsonConvert.DeserializeObject(json, bindingContext.ModelType);
}
catch
{
return null;
}
}
}
然后您可以像这样使用JsonParameterAttribute
:
public ActionResult GetLocations([JsonParameter] List<BoundingBox> boxes)
{
// ...
}
不要忘记序列化:
$.ajax({
url: '/Map/GetLocations',
type: 'POST',
data: { boxes: JSON.stringify(bounds) },
success: function(data) {
// doing something with the result
}
});
答案 1 :(得分:0)
如果您的Json格式与您显示的格式完全一致,那么我认为它需要采用此格式:
{
XHigh: -71.00742992911023,
XLow: -71.00670274612378,
YHigh: 42.09467040703646,
YLow: 42.09458047487587
}
Json反序列化会阻塞=
字符。
修改强>
如果你改变了
[HttpPost]
public ActionResult GetLocations(IList<BoundingBox> boxes)
{
// do something with boxes and return some json
}
到
[HttpPost]
public ActionResult GetLocations(BoundingBoxRequest request)
{
// do something with boxes and return some json
}
public class BoundingBoxRequest
{
public IList<BoundingBox> Boxes { get; set; }
}
然后你应能够将其发回并将其反序列化。