C# 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中:

我在Web.API和文化方面遇到了一些问题

例如(下面更详细的例子) 客户端发送号码:
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;}
    }