JSON在文化到文化的基础上传递null或0值

时间:2015-06-23 18:47:02

标签: c# jquery asp.net .net json

我正在使用C#和ASP.NET MVC5。我遇到的问题相对奇怪。

我们有一个多语言网站,使用_culture Cookie进行文化存储并更改Thread.CurrentThread.CurrentCulture以反映用户的文化。该网站上有经销商定位器。

以下是问题:

使用英语时(在本例中为en-CA),我们提交并正确解析了分发者定位器中的JSON。使用法语(fr)时,控制器操作显示纬度和经度为0.0,即使它在Chrome devtools控制台中解析时显示的值也是如此。半径似乎没有受到影响。

处理提交的jQuery:

$('.locate-distributors-form').on('submit', function(e) {
    $this = $('.locate-distributors-form');
    e.preventDefault();
    geocoder = new google.maps.Geocoder;
    var address = $('input[name=origin]').val();
    geocoder.geocode({
        'address': address
    }, function(results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
            var latLng = results[0].geometry.location;
            var locationToSubmit = {
                location: {
                    lat: latLng.lat(),
                    lng: latLng.lng()
                },
                radius: $('select[name=radius]').val()
            };
            $.ajax({
                url: $this.attr('action'),
                type: 'POST',
                data: locationToSubmit,
                success: function(data) {
                    // success function
                }
            });
        } else {
            // error text
        }
    });
})

当我们传入"Toronto"时,locationToSubmit对象等于:

{
  location: {
    lat: 43.653226,
    lng: -79.38318429999998 
  },
  radius: "50"
}

接受提交的操作如下所示:

public ActionResult LocateDistributors(Location location, int radius = 50)
{
    DistributorLocatorViewModel model = new DistributorLocatorViewModel();
    model.Origin = location;
    model.Distributors = locateDistributors(location, radius);

    return Json(model, JsonRequestBehavior.AllowGet);
}

最后,Location类被定义为:

public class Location
{
    public double Lat { get; set; }
    public double Lng { get; set; }
}

1 个答案:

答案 0 :(得分:0)

我认为这个问题与使用Thread.CurrentThread.CurrentCulture有关。这迫使.NET期望数字等等采用法语格式。例如,用英语,

{
  location: {
    lat: 43.653226,
    lng: -79.38318429999998 
  },
  radius: "50"
}

是正确的,会正确解析服务器端。

在法语中,小数位不是.而是,,因此前面提到的JSON需要是:

{
  location: {
    lat: '43,653226',
    lng: '-79,38318429999998' 
  },
  radius: "50"
}

为了解决问题,我不再使用Thread.CurrentThread.CurrentCulture而是使用Thread.CurrentThread.CurrentUICulture。这样做,我的后端将期待英式日期,数字等,同时仍然在用户的文化中展示。