ASP.NET Web应用切换页面后小数分隔符从逗号变回点的原因咨询
问题成因及解决方案
你遇到的问题核心在于直接在Program.cs启动时设置CultureInfo.CurrentCulture仅对启动线程生效,无法覆盖ASP.NET Core中每个请求的线程文化,具体成因分以下几点:
- 线程上下文隔离:ASP.NET Core为每个请求分配独立的线程(或线程池线程),启动时设置的文化是初始线程的属性,后续请求的线程不会继承这个设置,默认会使用系统或框架的默认文化(通常是en-US,小数分隔符为点)。
- 请求文化自动检测:框架默认启用了
RequestLocalizationMiddleware的文化提供程序,会从请求的Accept-Language头、Cookie或查询参数中读取文化设置。如果客户端发送的请求头包含其他文化(比如en-US),框架会自动切换到对应文化,覆盖你启动时的设置。 - 中间件顺序错误:如果你的文化设置代码没有放在正确的中间件位置,比如在
UseRouting()或UseEndpoints()之后,无法对后续请求的文化处理产生影响。
正确的解决方案
要全局强制所有页面使用nl-NL文化,应该使用ASP.NET Core的本地化中间件来配置,而不是直接设置线程文化:
- 在Program.cs中配置请求本地化选项:
builder.Services.Configure<RequestLocalizationOptions>(options => { var dutchCulture = new CultureInfo("nl-NL"); options.DefaultRequestCulture = new RequestCulture(dutchCulture); options.SupportedCultures = new[] { dutchCulture }; options.SupportedUICultures = new[] { dutchCulture }; // 若要完全忽略客户端请求头的文化,清空默认的文化提供程序 options.RequestCultureProviders.Clear(); });
- 在中间件管道中添加本地化中间件,注意要放在
UseRouting()之前:
app.UseRequestLocalization(); app.UseRouting(); // 其他中间件...
这样配置后,所有请求都会强制使用nl-NL文化,小数分隔符会保持为逗号,不会随页面切换而变化。
内容的提问来源于stack exchange,提问作者Cornelis
相关产品推荐
相关产品推荐

