我在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将包含正确的值。
答案 0 :(得分:3)
您的客户端提交的JSON无效JSON。 JSON基于JavaScript语法,浮点数使用点而不是逗号作为小数分隔符。来自json.org:
我忽略了这个值用引号括起来的事实,因此是一个有效的JSON字符串。显然,Web API尝试在模型绑定期间使用CultureInfo.InvariantCulture
将字符串转换为数字。有多种方法可以自定义请求映射到模型的方式,using a model binder可以允许您自定义字符串转换为数字的方式。