如何使用范围数据注释属性指定最小但没有最大十进制?


150

我想指定价格的小数字段必须大于等于0,但我真的不想强加最大值。

到目前为止,这就是我所拥有的...我不确定执行此操作的正确方法是什么。

[Range(typeof(decimal), "0", "??"] public decimal Price { get; set; }

当然,如果这要进入数据库,则需要根据所选数据库类型指定允许的最大数量?否则,如果超过此数目,您将得到令人讨厌的异常
Coops 2013年

Answers:


226

这样的事情怎么样:

[Range(0.0, Double.MaxValue, ErrorMessage = "The field {0} must be greater than {1}.")]

那应该做您想要的,并且可以避免使用字符串。


1
我已经将它用于Int32(Int32.MaxValue),还可以,谢谢!
Bronek

15
它确实显示了一个愚蠢的验证消息:(The field Fixed price discount must be between 0.01 and 1.79769313486232E+308.
Piotr Kula

16
@ppumkinAnvändErrorMessage,即[Range(0.0,Double.MaxValue,ErrorMessage =“您的错误在这里”)]
flafffl 2013年

谢谢雅各。好答案!
pimbrouwers 2015年

1
@ppumkin从DataAnnotationsModelValidator类继承以自定义错误消息
Alexander

91

如果您担心字符串看起来不错,可以执行以下操作:

    [Range(0, Double.PositiveInfinity)]

这将具有默认错误消息:

SuchAndSuch字段必须介于0和Infinity之间。


11
这是最好的答案,恕我直言,没有扩展名,没有看似随机的字符串/数字,没有自定义代码,并且有合理的错误消息。
维塔尼

42

似乎别无选择,只能手动输入最大值。我希望有某种类型的重载,而您无需指定其中的一种。

[Range(typeof(decimal), "0", "79228162514264337593543950335")]
public decimal Price { get; set; }

14
这段代码看起来很糟糕。我建议通过nuget和@Nicolai Schlenzig回答使用dataannotationsextensions.org。使用[Min(0)]-这也具有更好的验证消息。我建议您更新答案
Piotr Kula 2013年

我更新了它,使其与此处的最佳答案相同,因为OP并没有改变他的主意
Worthy7 '17

上面的答案(@Jordan和@Jacob)更合适。特别是因为我们在谈论价格。我了解很多次交易必须使用十进制值进行,但是没有任何价格1.234美元,或者至少在大多数情况下您不希望向用户显示此价格。
Anastasios Selmanis

@AnastasiosSelmanis,我同意您的看法,当您说“但没有任何价格1.234美元”时,请指望该部分。您假设美元,即使如此,当您将其用于外汇交易时(尽管OP并未在此处提及),美元的确会输入更多的小数位。=)
RoLYroLLs

35

您可以使用:

[Min(0)]

这将强制要求最小值为0(零),而没有最大值。

您需要DataAnnotationsExtensions才能使用它。


8
不,我不认为这是正确的。它不是标准MVC3框架的一部分,它来自Data Annotations Extensions dataannotationsextensions.org。请提供一个MSDN链接。
伯尼·怀特

1
不-绝对不是MVC 3的一部分:(但是该库是一个不错的扩展,可以通过任何方式:)
Piotr Kula

1
它不是MVC3的一部分,但并不重要。如果要在客户端进行验证,则只需使用DataAnnotationsExtensions.MVC3包。这两个软件包在nuget上可用。我认为这是最好的方法,因为您没有愚蠢的错误消息,也不需要每次都要验证正整数或十进制(这是很常见的)时都需要重新定义错误消息。
gentiane 2014年

21

如果您使用价格,我相信您可以放心地假设没有东西会花费超过1万亿美元。

我会用:

[Range(0.0, 1000000000000)]

或者,如果您确实需要它,只需粘贴Decimal.MaxValue(不带逗号)的值:79,228,162,514,264,337,593,543,950,335

如果您不是来自津巴布韦的人,则其中任何一种都可以正常工作。


7
为什么不只是[Range(0.0,Decimal.MaxValue)]呢?
合作社

4
无法编译,Decimal.MaxValue不是常数。
约翰·法瑞尔

该常量很麻烦,引用资源文件中的错误文本并不容易
Coops 2013年

3
现在,您假设货币是美元,而不是日元或其他。
2015年

1
@jfar Decimal.MaxValue是一个常量。只是Range没有过载来容纳小数。
ΕГИІИО

11

您可以使用自定义验证:

    [CustomValidation(typeof(ValidationMethods), "ValidateGreaterOrEqualToZero")]
    public int IntValue { get; set; }

    [CustomValidation(typeof(ValidationMethods), "ValidateGreaterOrEqualToZero")]
    public decimal DecValue { get; set; }

验证方法类型:

public class ValidationMethods
{
    public static ValidationResult ValidateGreaterOrEqualToZero(decimal value, ValidationContext context)
    {
        bool isValid = true;

        if (value < decimal.Zero)
        {
            isValid = false;
        }

        if (isValid)
        {
            return ValidationResult.Success;
        }
        else
        {
            return new ValidationResult(
                string.Format("The field {0} must be greater than or equal to 0.", context.MemberName),
                new List<string>() { context.MemberName });
        }
    }
}

2

我打算尝试这样的事情:

[Range(typeof(decimal), ((double)0).ToString(), ((double)decimal.MaxValue).ToString(), ErrorMessage = "Amount must be greater than or equal to zero.")]

但是,这样做的问题在于,编译器需要一个常量表达式,该表达式不允许使用((double)0).ToString()。编译器采取

[Range(0d, (double)decimal.MaxValue, ErrorMessage = "Amount must be greater than zero.")]

谁对此表示反对,请解释一下您为什么认为我的解决方案不好或没有帮助?因为仅仅投票而没有任何解释是完全没有帮助的。
David T. Macknet

您的错误消息应显示为“大于或等于”。
ΕГИІИО

接得好。添加。
David T. Macknet,

1

使用范围

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

[Range(typeof(Decimal),"0.0", "1000000000000000000"]

希望对你有帮助



0

我要说的decimal.MaxValue.ToString()是,这是decmial类型的有效上限,它等效于没有上限。


4
问题是这不是一个常数。您会收到此错误:属性参数必须是属性参数类型的常量表达式,typeof表达式或数组创建表达式
user169867

就像我在下面指出的那样,但是显然没有人对此表示赞赏。
David T. Macknet
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.