我正在使用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; }
}
答案 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
。这样做,我的后端将期待英式日期,数字等,同时仍然在用户的文化中展示。