You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用VS2012与ASP.NET MVC DataAnnotations验证decimal字段时遇类型转换错误

解决ASP.NET MVC DataAnnotations验证decimal字段时的“无法将int32转换为System.Array”错误

嘿,我一眼就看出问题出在哪了——你给decimal类型的porcentaje字段用了MaxLength特性,这可是个典型的误用坑!MaxLengthAttribute是专门给字符串类型设计的,它内部是针对字符数组(字符串本质就是字符数组)做长度校验的,你把它用在数值类型上,框架自然会抛出类型转换错误。

怎么修复?看这几步:

  • 立刻移除MaxLength特性:它对decimal完全没用,如果你想限制数值的位数,用Range或者调整正则表达式就行。
  • 把注释掉的Range特性改对:你原来写的Range(0, 9999999999999999.99)在旧版本ASP.NET MVC(比如VS2012对应的MVC4)里容易出问题,因为框架可能会把大数值误解析成int类型,建议用typeof(decimal)来显式指定类型,避免解析错误。
  • 保留有用的特性:Required和RegularExpression是适合decimal字段的,继续留着就行。

修正后的代码长这样:

[Display(Name = "Porcentaje")]
[Required(ErrorMessage = "Requerido")]
[RegularExpression(@"^\$?\d+(\.(\d{2}))?$", ErrorMessage = "Número con dos decimales")]
// 显式指定decimal类型,避免类型解析异常
[Range(typeof(decimal), "0", "9999999999999999.99", ErrorMessage = "Máximo 18 dígitos")]
public decimal porcentaje { get; set; }

再补充两句:

如果你不需要限制数值范围,只保留Required和RegularExpression就足够验证格式了。至于那个奇怪的“int32转Array”错误,本质就是MaxLength特性被误用在非字符串/数组类型上,框架内部的类型转换逻辑崩了而已。

内容的提问来源于stack exchange,提问作者Jhon Hernández

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:05:28