如何避免Razor View将decimal类型小数拆分为两个整数
问题原因
- 核心就是区域文化设置导致的:ASP.NET 渲染C#数值类型到前端时,默认会用当前生效的区域文化做格式化,部分区域的小数分隔符不是英文点(.),而是空格、逗号这类符号。你的
4.6666M渲染到页面时被转成了4 6666,插入JS代码后会被识别为两个独立数字,自然输出空格分隔的结果。 - 你写的代码本身也有语法问题:Razor只会解析带
@前缀的服务端代码,你写的var jsItem = Model.AllTotalQuotes.SomeItem;没有加@,Model不会被服务端识别,jsItem实际是未赋值的JS变量,逻辑完全不符合你的预期。
你之前尝试的两种方案都是C#层面的类型转换,转换后还是decimal类型,渲染时仍然会走默认的区域格式化逻辑,所以解决不了问题。
解决方案
按需选择下面任意一种方案即可:
方案1:单场景强制固定格式
适合只有个别地方需要输出数值到JS的场景,显式指定用固定文化格式化:
- 先在视图顶部或者
_ViewImports.cshtml引入命名空间:
@using System.Globalization
- 修改JS代码:
<script> var jsItem = @Model.AllTotalQuotes.SomeItem.ToString(CultureInfo.InvariantCulture); console.log(jsItem); </script>
方案2:全局配置固定文化
如果项目没有多区域本地化需求,直接全局配置用固定文化,一劳永逸:
在Program.cs中添加配置:
// 服务注册阶段添加 builder.Services.Configure<RequestLocalizationOptions>(options => { options.DefaultRequestCulture = new RequestCulture(CultureInfo.InvariantCulture); options.SupportedCultures = new List<CultureInfo> { CultureInfo.InvariantCulture }; options.SupportedUICultures = new List<CultureInfo> { CultureInfo.InvariantCulture }; }); // 中间件配置阶段,放在UseRouting之后、UseAuthorization之前添加 app.UseRequestLocalization();
配置完成后直接按原生写法输出即可:
<script> var jsItem = @Model.AllTotalQuotes.SomeItem; console.log(jsItem); </script>
方案3:用JSON序列化自动处理格式
不想处理文化配置的话,直接用JSON序列化输出,数值格式永远符合JS语法要求:
<script> var jsItem = @Json.Serialize(Model.AllTotalQuotes.SomeItem); console.log(jsItem); </script>
内容的提问来源于stack exchange,提问作者bakunet
相关产品推荐
相关产品推荐

