Web.API:无法设置文化

时间:2015-02-19 13:46:20

标签: c# asp.net .net

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

例如(下面更详细的例子) 客户端发送号码:500.000,并将其解释为five hunderd instead of five hunderd thousand

我在使用Windows Forms applications时遇到过这个问题。我只会设置culture for the thread。但是使用Web.Api(这对我来说是全新的)我需要更改my tactic

我的搜索为我提供了几个有希望的解决方案,但似乎没有任何工作可以解决问题。我有没有得到任何指示或者能指出我正确的解决方案?

使用了一些例子:

解决方案1: 在webservice的web.config中:提供system.web

下的文化
<system.web>
  <globalization enableClientBasedCulture="false" culture="nl-BE" uiCulture="nl-BE"/>
</system.web>

解决方案2: 在我的控制器的构造中

    CultureInfo ci = new CultureInfo("nl-BE");
    Thread.CurrentThread.CurrentCulture = ci;
    Thread.CurrentThread.CurrentUICulture = ci;

解决方案3: 编辑global.asax 使用提到here但没有骰子的解决方案。

    protected void Application_BeginRequest(object sender, EventArgs e)
    {
        CultureInfo newCulture = (CultureInfo)System.Threading.Thread.CurrentThread.CurrentCulture.Clone();
        newCulture.NumberFormat.NumberDecimalSeparator = ",";
        newCulture.NumberFormat.NumberGroupSeparator = ".";
        Thread.CurrentThread.CurrentCulture = newCulture; 
        Thread.CurrentThread.CurrentUICulture = newCulture; 
    }

一些代码:

对象:

    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.
          ...
    }

我的dwindeling耐心感谢。

注意:该应用程序仅限于.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将包含正确的值。

1 个答案:

答案 0 :(得分:3)

您的客户端提交的JSON无效JSON。 JSON基于JavaScript语法,浮点数使用点而不是逗号作为小数分隔符。来自json.org

JSON number

我忽略了这个值用引号括起来的事实,因此是一个有效的JSON字符串。显然,Web API尝试在模型绑定期间使用CultureInfo.InvariantCulture将字符串转换为数字。有多种方法可以自定义请求映射到模型的方式,using a model binder可以允许您自定义字符串转换为数字的方式。