12

我有以下代码工作

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

当页面提交时 Price = EMPTY Field 错误消息是“Price is required.”。价格 = 超过 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; }
4

3 回答 3

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}.")]
于 2012-08-28T17:54:55.583 回答
5

首先,我认为您将希望将 Range 属性更改为

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

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

第二:

“字段 productPrice 必须是数字。”

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

$.validator.methods.number = function (n, t) {
    return true;
}
于 2012-08-28T18:04:05.173 回答
0

我认为您可能会绊倒 jQuery 中的错误。该验证正在与为您的验证属性发出的内容作斗争。

我有以下财产:

[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。0.075 的值会产生“字段值必须是数字”,您似乎遇到了同样的问题。

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

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

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

于 2013-09-10T21:41:21.060 回答