0

我有一个 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 中将它们更改为doubles,仍然是 0.0。我尝试将它们更改为strings 并且它们是空的。

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

4

2 回答 2

1

我为这个问题写了一个小助手,因为我也遇到了你的问题的一些变化。我通过将我的 JS 对象的序列化版本发送到服务器(使用JSON.stringify())并让 MVC 即时反序列化它来解决这些问题。

我写的第一堂课是JsonParameterAttribute. TypedJsonBinder它指示 MVC在绑定修饰参数时使用 my 。

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
    }
});
于 2012-10-12T11:41:39.520 回答
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; }
}

那么您应该能够将其发回并对其进行反序列化。

于 2012-10-12T05:00:06.790 回答