NumberDecimalSeparator

NumberDecimalSeparator

我有一个带有十进制属性的简单模型:

public class Model {
    public decimal Quantity { get;set; }
}


我认为我有:

@Html.TextBoxFor(m => m.Quantity)
@Html.ValidationMessageFor(m => m.Quantity)


问题是,当我尝试使用小数部分(例如1.5、2.5等)发布值时,我会在客户端或服务器端收到验证错误,具体取决于所使用的NumberDecimalSeparator。如果我发布1,5,则会收到客户端验证错误(数据值第一),或者如果我发布1.5,则会收到服务器端模型验证错误-"The value '1.5' is not valid for Quantity."。我试图在Global.asax中的NumberDecimalSeparator上手动设置Application_Start(),但这没有帮助。

var currentCulture = (CultureInfo)CultureInfo.CurrentCulture.Clone();
currentCulture.NumberFormat.NumberDecimalSeparator = ".";

Thread.CurrentThread.CurrentCulture = currentCulture;
Thread.CurrentThread.CurrentUICulture = currentCulture;


当我手动向数据库中添加一些值并尝试对其进行编辑时,TextBox中的值显示为点".",但是当我尝试使用该点保存另一个值时,出现服务器端验证错误。可能是什么原因?为什么手动文化信息更新不起作用?

//编辑:
我更改currentCulture.NumberFormat.NumberDecimalSeparator的方法有效,但前提是每次我必须在Application_BeginRequest()上执行此操作:

protected override void Application_BeginRequest(object sender, System.EventArgs e)
{
       var currentCulture = (CultureInfo)CultureInfo.CurrentCulture.Clone();
       currentCulture.NumberFormat.NumberDecimalSeparator = ".";
       currentCulture.NumberFormat.NumberGroupSeparator = " ";
       currentCulture.NumberFormat.CurrencyDecimalSeparator = ".";

       Thread.CurrentThread.CurrentCulture = currentCulture;
       Thread.CurrentThread.CurrentUICulture = currentCulture;
       base.Application_BeginRequest(sender, e);
}


为什么在应用程序启动时不起作用?

最佳答案

我认为在Application_Start中不起作用是合乎逻辑的,因为您为每个线程设置了区域性。

您可以在web.config中全局设置区域性:

<configuration>
    <system.web>
        <globalization uiCulture="en-GB" culture="en-GB" />
    </system.web>
</configuration>


但是,如果您希望(如您的示例所示)具有俄罗斯文化但使用不同的小数点分隔符,那么我认为Application_BeginRequest()可能是一个不错的选择。根据documentation


  在以下情况下作为HTTP管道执行链中的第一个事件发生
  ASP.NET响应请求。


但是您需要小心,因为实际上每个请求都会触发此事件。

我不久前解决了类似的问题。在我的情况下,用户可以在文化之间进行切换。因此,每个用户区域性都保存在数据库中,因此,我们使用控制器的Initialize方法而不是Application_BeginRequest()。然后,我们根据当前的线程文化设置所有用于客户端验证的规则。

我认为这样的功能也可以像this answer中那样进行过滤。

10-01 10:41