使用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
相关产品推荐
相关产品推荐

