将边界框从JavaScript发送到操作方法

时间:2012-10-12 00:07:14

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

我有一个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并且它们是空的。

我是否在模型绑定中遗漏了如何填充这些值的内容?如何将此数组对象发送到我的操作方法?

2 个答案:

答案 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; }
}

然后你能够将其发回并将其反序列化。