C# Web.API:无法设置区域性
我在Web.API和文化方面遇到了一些问题 例如(下面更详细的例子) 客户端发送号码:C# Web.API:无法设置区域性,c#,asp.net,.net,C#,Asp.net,.net,我在Web.API和文化方面遇到了一些问题 例如(下面更详细的例子) 客户端发送号码:500.000,它被解释为500.000,而不是500.000 我在Windows窗体应用程序中遇到了这个问题。在那里,我只需设置线程的区域性。但是使用Web.Api(这对我来说是全新的),我需要改变我的策略 我的搜索为我提供了几个有希望的解决方案,但迄今为止似乎没有一个能奏效。有人能为我提供任何指导或能为我指出正确的解决方案吗 所使用的一些例子: 解决方案1: 在webservice的web.config中:
500.000
,它被解释为500.000
,而不是500.000
我在Windows窗体应用程序中遇到了这个问题。在那里,我只需设置线程的区域性
。但是使用Web.Api(这对我来说是全新的),我需要改变我的策略
我的搜索为我提供了几个有希望的解决方案,但迄今为止似乎没有一个能奏效。有人能为我提供任何指导或能为我指出正确的解决方案吗
所使用的一些例子:
解决方案1:
在webservice的web.config中:在system.web下提供区域性
<system.web>
<globalization enableClientBasedCulture="false" culture="nl-BE" uiCulture="nl-BE"/>
</system.web>
解决方案3:编辑global.asax
使用上述溶液,但不使用骰子
或
一些代码:
对象:
public class Book
{
public String Author {get; set;}
public String Title {get; set;}
public Double Price {get; set;}
}
客户端发送的Json:
{ "Author": "User09","Title": "User09 The biography", "Price":"50,39" }
=> With the meaning of 50 euros and 39 cents
职能:
[HttpPost]
public String StoreNewObject(Book myBook)
{
// myBook.Price already contains 5039.0 (as in 5039 euros and 0 cents) here before the first line of code is executed.
...
}
我越来越少的耐心感谢上帝
注意:该应用程序仅限于.Net 4.0
注2:发现一个正在工作(丑陋的解决方案)
将我的模型更改如下:
public class Book
{
public String Author {get; set;}
public String Title {get; set;}
public String Price {
get { return PriceValue.ToString();
set {
CultureInfo ci = new CultureInfo("nl-BE");
PriceValue = Math.Round(Convert.ToDouble(value, ci),2);
}
}
public Double PriceValue {get; set;}
}
在这种情况下,PriceValue将包含正确的值。客户端提交的JSON不是有效的JSON。JSON基于JavaScript语法,浮点数使用点而不是逗号作为十进制分隔符。发件人:
我忽略了一个事实,即该值用引号括起来,因此是一个有效的JSON字符串。显然,Web API试图在模型绑定期间使用
CultureInfo.InvariantCulture
将字符串转换为数字。有多种方法可以自定义请求如何映射到模型,并允许您自定义字符串如何转换为数字。在解决方案3中,如果要创建区域性克隆,请设置分隔符,但不要使用克隆。尝试添加Thread.CurrentThread.CurrentCulture=newCulture;Thread.CurrentThread.CurrentUICulture=newCulture;解决3@user469104:注意得很好。但是添加它并没有解决我的问题!如果您使用的是.NET 4.5,则可以尝试使用此解决方案@user469104中指定的CultureInfo.DefaultThreadCurrentCulture。我也遇到了这个解决方案。不幸的是,我仅限于.NET4.0。我要补充一句,马丁,谢谢你的见解。但根据我们喜爱的web上的JSON解析器,它是有效的JSON。但是你的话确实给了我一个新的想法去尝试。很好的计划!!!!是否JSON是正确的,因为值(my double)是用引号封装的?@user9999999:上面明确说明数字可以包含点,但不能包含逗号。但是解析器经常放弃解释为什么“我们喜爱的web上的JSON解析器”和web API都解析这个数字。问题是解析的结果不是您所期望的。感谢您提供的见解:)@User999999:如果值包含在引号中,则它是一个字符串,然后它是有效的JSON。但是我希望服务器端的数据类型也是字符串。在这种情况下,您可以使用您喜欢的任何方法(包括使用特定的CultureInfo
)在服务器端解析字符串。
[HttpPost]
public String StoreNewObject(Book myBook)
{
// myBook.Price already contains 5039.0 (as in 5039 euros and 0 cents) here before the first line of code is executed.
...
}
public class Book
{
public String Author {get; set;}
public String Title {get; set;}
public String Price {
get { return PriceValue.ToString();
set {
CultureInfo ci = new CultureInfo("nl-BE");
PriceValue = Math.Round(Convert.ToDouble(value, ci),2);
}
}
public Double PriceValue {get; set;}
}