C# 如何使用“范围数据注释”属性指定最小值,但不指定最大值?

C# 如何使用“范围数据注释”属性指定最小值,但不指定最大值?,c#,.net,asp.net-mvc,data-annotations,C#,.net,Asp.net Mvc,Data Annotations,我想指定价格的十进制字段必须大于等于0,但我不想强制使用最大值 这是我到目前为止得到的…我不确定正确的方法是什么 [Range(typeof(decimal), "0", "??"] public decimal Price { get; set; } 我会把decimal.MaxValue.ToString()放在中,因为这是decimal类型的有效上限,它相当于没有上限。类似这样的东西怎么样: [Range(0.0, Double.MaxValue, ErrorMessage = "The

我想指定价格的十进制字段必须大于等于0,但我不想强制使用最大值

这是我到目前为止得到的…我不确定正确的方法是什么

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

我会把decimal.MaxValue.ToString()放在
中,因为这是decimal类型的有效上限,它相当于没有上限。

类似这样的东西怎么样:

[Range(0.0, Double.MaxValue, ErrorMessage = "The field {0} must be greater than {1}.")]
[Range(typeof(decimal), ((double)0).ToString(), ((double)decimal.MaxValue).ToString(), ErrorMessage = "Amount must be greater than or equal to zero.")]

这应该可以满足您的需要,并且可以避免使用字符串。

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

我会使用:

[Range(0.0, 1000000000000)]
或者如果您确实需要它,只需粘贴
Decimal.MaxValue的值(不带逗号):
79228162514264337593543950335


如果您不是津巴布韦人,这两种方法中的任何一种都能很好地发挥作用。

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

[Range(typeof(decimal), "0", "79228162514264337593543950335")]
public decimal Price { get; set; }
您可以使用:

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


您需要使用它。

您可以使用自定义验证:

    [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 });
        }
    }
}
公共类验证方法
{
公共静态ValidationResult ValidateGraterOreQualtoZero(十进制值,ValidationContext上下文)
{
bool isValid=true;
if(值<十进制0)
{
isValid=false;
}
如果(有效)
{
返回ValidationResult.Success;
}
其他的
{
返回新的ValidationResult(
格式(“字段{0}必须大于或等于0。”,context.MemberName),
新列表(){context.MemberName});
}
}
}

我想试试这样的东西:

[Range(0.0, Double.MaxValue, ErrorMessage = "The field {0} must be greater than {1}.")]
[Range(typeof(decimal), ((double)0).ToString(), ((double)decimal.MaxValue).ToString(), ErrorMessage = "Amount must be greater than or equal to zero.")]
但是,这样做的问题是编译器需要一个常量表达式,这不允许
((double)0).ToString()
。编译器将执行以下操作:


如果您担心字符串是否美观,可以这样做:

    [Range(0, Double.PositiveInfinity)]
这将有一个默认错误消息:

字段suchHandsuch必须介于0和无穷大之间

使用范围与

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

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


希望它能有所帮助

[范围(0.01100000000,ErrorMessage=“价格必须大于零!”)]

问题在于这不是一个常数。你会得到这样的错误:一个属性参数必须是一个常量表达式、typeof表达式或属性参数types的数组创建表达式,正如我在下面指出的,但显然没有人喜欢它。不,我不认为这是正确的。它不是标准MVC3框架的一部分,而是来自数据注释扩展。请提供MSDN链接。否-绝对不是MVC 3的一部分:(但该库是一个很好的扩展:)不是MVC3的一部分,但它并不重要。若要在客户端进行验证,只需使用DataAnnotationsExtensions.MVC3包。这两个包在nuget上提供。我认为这是最好的方法,因为您没有愚蠢的错误消息,或者不需要在每次验证正整数或十进制(这是很常见的)时重新定义错误消息。为什么不干脆
[范围(0.0,decimal.MaxValue)]
?不会编译,decimal.MaxValue不是常量。该常量很麻烦,在资源文件中引用错误文本并不容易。现在,假设货币是美元,而不是日元或其他货币。@jfar Decimal.MaxValue是一个常量。只是范围没有重载来容纳十进制数。当然,如果要将其放入数据库,您需要根据所选数据库类型指定允许的最大数?否则,如果超过此数字,您将得到一个严重的异常。我已将其用于Int32(Int32.MaxValue),并且还可以,谢谢!但它确实显示了一条愚蠢的验证消息:(
字段固定价格折扣必须介于0.01和1.79769313486232E+308之间。
@ppumkin Anväand ErrorMessage,即[Range(0.0,Double.MaxValue,ErrorMessage=“此处的错误”)]谢谢Jacob。回答得很好!@ppumkin从DataAnnotationsModelValidator类继承来自定义错误消息此代码看起来很糟糕。我建议使用via nuget和@Nicolai Schlenzig回答。使用
[Min(0)]
-这也有一个更好的验证消息。我建议更新您的答案。我更新了它,使其与此处的最佳答案相同,因为OP没有改变对上述答案的看法(@Jordan and@Jacob)更合适。特别是因为我们谈论的是价格。我知道很多时候交易都必须用十进制值来完成,但没有任何价格1.234美元,或者至少在大多数情况下你不想向用户展示它。@AnastasiosSelmanis,我同意你的观点,期待你说的部分“但是没有任何价格1.234美元”。你假设的是美元,即使如此,当你用美元兑换外汇时(虽然OP在这里没有提到),美元也会变成更多的小数。=)这是这里的最佳答案,没有扩展名,没有看似随机的字符串/数字,没有自定义代码,还有一条合理的错误消息。谁否决了这条消息,请解释为什么你认为我的解决方案很差或没有帮助?因为没有任何解释就直接否决是完全没有帮助的。你的错误消息应该说“大于或等于“。捕获良好。已添加。