MVC 4 - DataAnnotations - 对类型的验证

Rav*_*Ram 12 asp.net asp.net-mvc data-annotations

我有以下代码工作

    [Required(ErrorMessage = "Price is required.")]
    [Range(typeof(Decimal), "1", "9999", ErrorMessage = "Price xx.xx")]
    public decimal? productPrice { get; set; }
Run Code Online (Sandbox Code Playgroud)

当提交页面时,Price = EMPTY字段错误消息为"需要价格".价格=超过9999错误消息是"价格xx.xx".

但是,当我输入'aaaa'时,错误消息是 "字段productPrice必须是数字".

如果键入不正确,我该如何更改消息?例如:"价格必须是1-9999之间的小数/数字.

----更新:---- 以下代码使用

NULL,非十进制,在范围之间,但不使用".1".

    [Required(ErrorMessage = "Price is required.")]
    [RegularExpression(@"[0-9]*\.?[0-9]+", ErrorMessage = "Price must be a Numbers only.")]
    [Range(typeof(Decimal), "1", "9999", ErrorMessage = "Price must be a decimal/number between {1} and {2}.")]
    public decimal? productPrice { get; set; }
Run Code Online (Sandbox Code Playgroud)

JOB*_*OBG 12

您可以尝试使用正则表达式:

[RegularExpression(@"[0-9]*\.?[0-9]+", ErrorMessage = "{0} must be a Number.")]
Run Code Online (Sandbox Code Playgroud)

您还可以尝试使用Data Annotations Extensions:http: //dataannotationsextensions.org/Home/Wiki

或编写自己的实现,如下所示:https: //github.com/srkirkland/DataAnnotationsExtensions/blob/master/DataAnnotationsExtensions/DigitsAttribute.cs

更新 与REGEX(匹配$ 9,999.99 | $ 0.70 | .1)

[RegularExpression(@"^\$?([1-9]{1}[0-9]{0,2}(\,[0-9]{3})*(\.[0-9]{0,2})?|[1-9]{1}[0-9]{0,}(\.[0-9]{0,2})?|0(\.[0-9]{0,2})?|(\.[0-9]{1,2})?)$", ErrorMessage = "{0} must be a Number.")]
Run Code Online (Sandbox Code Playgroud)

或者使用Range稍微修改@Martin建议(实际上是一个更好的解决方案):

[Range(typeof(Decimal), "0", "9999", ErrorMessage = "{0} must be a decimal/number between {1} and {2}.")]
Run Code Online (Sandbox Code Playgroud)

  • 这种正则表达式将在各种情况下失败,例如".1"我不建议使用正则表达式来处理数字.正则表达式用于匹配字符串(文本)输入.RangeAttribute是解决此问题的最合适方法. (2认同)

Mar*_*ers 5

首先,我想你会想要将Range属性更改为

[Range(typeof(Decimal), "1", "9999", ErrorMessage = "{0} must be a decimal/number between {1} and {2}.")]
Run Code Online (Sandbox Code Playgroud)

根据MSDN,这是使用RangeAttribute的有效方法.

第二:

"现场产品价格必须是一个数字."

这实际上是不引人注意的客户端JavaScript验证.您的范围验证器将在验证号码后触发.您可以禁用数字验证器,但我不建议这样做:

$.validator.methods.number = function (n, t) {
    return true;
}
Run Code Online (Sandbox Code Playgroud)