MVC 4 - DataAnnotations - 对类型的验证

时间:2012-08-28 17:48:09

标签: 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; }

提交页面时 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; }

3 个答案:

答案 0 :(得分:12)

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

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

您还可以尝试数据注释扩展: 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.")]

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

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

答案 1 :(得分:5)

首先,我认为您需要将Range属性更改为

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

According to MSDN,这是使用RangeAttribute的有效方法。

第二

  

“字段productPrice必须是数字。”

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

$.validator.methods.number = function (n, t) {
    return true;
}

答案 2 :(得分:0)

我认为你可能会绊倒jQuery中的一个bug。该验证是针对您的验证属性而发布的内容。

我有以下属性:

[Display(ResourceType = typeof(TaxSetupResources), Name = "Model_Value")]
[RegularExpression(@"(^\d+$)|(^\.\d{1,4}$)|(^\d*\.\d{0,4}$)", ErrorMessageResourceName="Model_InvalidFormatForAmount", ErrorMessageResourceType=typeof(TaxSetupResources))]
public decimal? Value { get; set; }

在这样的视图中使用:

<div>
    @Html.TextBoxFor(t => t.Tiers[i].Value, new { title = @Resources.TaxSetupResources.Model_ValueTip })
    <br />@Html.ValidationMessageFor(t => t.Tiers[i].Value)
</div>

就其本身而言,值“foo”会产生我的错误消息。值0.075被接受。值.075会产生“字段值必须是数字”,这与您似乎遇到的问题相同。

基于this SO article,我在文档准备中添加了以下内容:

$(function () {
    $.validator.methods.number = function (value, element) {
        return parseFloat(value).toString() !== "NaN";
    }
});

现在我只收到错误消息,并且仅在预期时(接受.075)。