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

use*_*867 135 .net c# asp.net-mvc data-annotations

我想指定一个价格的十进制字段必须> = 0但我真的不想强加一个最大值.

这是我到目前为止所做的......我不确定这样做的正确方法是什么.

[Range(typeof(decimal), "0", "??"] public decimal Price { get; set; }
Run Code Online (Sandbox Code Playgroud)

小智 202

这样的事情怎么样:

[Range(0.0, Double.MaxValue)]
Run Code Online (Sandbox Code Playgroud)

这应该做你想要的,你可以避免使用字符串.

  • 这适用于双倍,但十进制呢? (14认同)
  • 它确实显示了一个愚蠢的验证消息:(`字段固定价格折扣必须介于0.01和1.79769313486232E + 308之间. (14认同)
  • @ppumkinAnvändErrorMessage,即[Range(0.0,Double.MaxValue,ErrorMessage ="你的错误在这里")] (14认同)

Jor*_*dan 75

如果你担心字符串看起来不错,你可以这样做:

    [Range(0, Double.PositiveInfinity)]
Run Code Online (Sandbox Code Playgroud)

这将有一个默认的错误消息:

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

  • 这是恕我直言的最佳答案,没有扩展,没有看似随机的字符串/数字,没有自定义代码,以及合理合理的错误消息. (6认同)

use*_*867 40

哦,似乎别无选择,只能手动输入最大值.我希望有一些类型的重载,你不需要指定一个.

[Range(typeof(decimal), "0", "79228162514264337593543950335")]
public decimal Price { get; set; }
Run Code Online (Sandbox Code Playgroud)

  • 这段代码看起来很糟糕.我建议使用http://dataannotationsextensions.org/通过nuget和@Nicolai Schlenzig回答.使用`[Min(0)]` - 这也有更好的验证信息.我建议更新你的答案 (11认同)

Nic*_*zig 32

您可以使用:

[Min(0)]
Run Code Online (Sandbox Code Playgroud)

这将强制要求的最小值为0(零),并且没有最大值.

您需要DataAnnotationsExtensions才能使用它.

  • 不,我不认为这是正确的.它不是标准MVC3框架的一部分,它来自Data Annotations Extensions http://dataannotationsextensions.org/.请提供MSDN链接. (8认同)
  • 不 - 绝对不是 MVC 3 的一部分 :( 但是那个库是一个很好的扩展 :) (2认同)
  • 不是 MVC3 的一部分,但并不重要。如果你想在客户端进行验证,你只需要使用 DataAnnotationsExtensions.MVC3 包。nuget 上提供了这两个包。我认为这是最好的方法,因为您没有愚蠢的错误消息,也不需要每次想要验证正整数或小数时都需要重新定义错误消息(这相当常见)。 (2认同)

Joh*_*ell 19

如果您使用价格,我相信您可以放心地承担任何费用将花费超过1万亿美元.

我用的是:

[Range(0.0, 1000000000000)]
Run Code Online (Sandbox Code Playgroud)

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

如果你不是来自津巴布韦,其中任何一个都会运作良好.

  • 为什么不只是`[Range(0.0,Decimal.MaxValue)]`? (7认同)
  • 不会编译,Decimal.MaxValue不是常量. (4认同)
  • @jfar Decimal.MaxValue 是一个常量。只是 Range 没有过载来容纳小数。 (4认同)
  • 现在你假设货币是美元,而不是日元或其他东西. (3认同)

Eri*_*sta 11

您可以使用自定义验证:

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

    [CustomValidation(typeof(ValidationMethods), "ValidateGreaterOrEqualToZero")]
    public decimal DecValue { get; set; }
Run Code Online (Sandbox Code Playgroud)

验证方法类型:

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 });
        }
    }
}
Run Code Online (Sandbox Code Playgroud)