C# ASP.NET中Price输入框触发「必须为数字」验证的问题
解决Decimal字段输入逗号小数点的验证问题
嘿,这个问题我之前也碰到过,大概率是客户端验证的区域设置不匹配导致的!ASP.NET MVC默认用的jQuery Validation插件是按英文区域规则(.当小数点)来验证数值的,但你输入的是,当小数点,所以客户端直接判定这不是有效数字,就弹出那条错误提示了。而另一个表单能正常工作,估计是它的页面配置了正确的区域支持,或者干脆跳过了客户端验证,让服务器端来处理了。
具体原因拆解
- 两个表单所在的页面,一个可能引入了区域适配的验证脚本,另一个没有;
- 或者其中一个页面的客户端验证被禁用,服务器端的区域设置刚好支持逗号小数点,所以能正常解析。
给你几个可行的解决方案
方案1:全局配置区域文化(最推荐)
直接在Web.config里设置支持逗号小数点的文化(比如荷兰语nl-NL,看你实际使用的区域),让客户端和服务器端规则统一:
<system.web> <!-- 替换成你需要的区域文化,比如nl-NL、de-DE等 --> <globalization culture="nl-NL" uiCulture="nl-NL" /> </system.web>
配置完之后,ASP.NET会自动适配jQuery Validation的验证规则,不用改其他代码就能支持逗号输入了。
方案2:给单个字段定制验证规则
如果不想全局改区域,就针对Price字段单独处理。先给模型的Price属性加两个特性:
[DisplayFormat(DataFormatString = "{0:N2}", ApplyFormatInEditMode = true)] [DataType(DataType.Currency)] public decimal Price { get; set; }
然后在出问题的页面里,引入Globalize相关的脚本,替换默认的数字验证方法:
<!-- 确保你已经引入了jquery.validate.js和globalize.js --> <script src="~/Scripts/jquery.validate.globalize.js"></script> <script src="~/Scripts/globalize.culture.nl-NL.js"></script> <script> $(function () { // 设置当前区域,替换成你需要的文化代码 Globalize.culture('nl-NL'); // 重写jQuery的数字验证方法,用Globalize来解析数值 $.validator.methods.number = function (value, element) { return this.optional(element) || !isNaN(Globalize.parseFloat(value)); }; }); </script>
这样就能让这个页面的数字验证支持逗号小数点了。
方案3:临时禁用该字段的客户端验证(不推荐,应急用)
如果只是想快速测试,或者暂时不想改配置,可以给输入框加个data-val="false"属性,关掉客户端验证:
@Html.EditorFor(model => model.Price, new { htmlAttributes = new { @class = "form-control", data_val = "false" } })
不过这个方法只是绕过客户端验证,服务器端如果区域设置不对还是会报错,所以最好还是用前两个方案从根本上解决。
为啥另一个表单没问题?
你可以对比一下两个页面的脚本引入,或者模型的属性配置,大概率是:
- 另一个页面已经引入了区域适配的验证脚本;
- 或者另一个表单的客户端验证被禁用了;
- 甚至可能另一个模型的Price字段有额外的特性配置。
排查一下这些点,就能找到具体原因啦!
内容的提问来源于stack exchange,提问作者Luca
相关产品推荐
相关产品推荐

