如何使用范围数据注释属性指定最小但没有最大小数?
Posted
技术标签:
【中文标题】如何使用范围数据注释属性指定最小但没有最大小数?【英文标题】:How to specify a min but no max decimal using the range data annotation attribute? 【发布时间】:2011-03-21 16:41:23 【问题描述】:我想指定价格的小数字段必须 >= 0,但我真的不想强加最大值。
这是我目前所拥有的...我不确定正确的方法是什么。
[Range(typeof(decimal), "0", "??"] public decimal Price get; set;
【问题讨论】:
当然,如果这要进入数据库,您需要根据所选数据库类型指定最大允许数量吗?否则,如果超过此数字,您将得到一个令人讨厌的异常 【参考方案1】:这样的事情怎么样:
[Range(0.0, Double.MaxValue, ErrorMessage = "The field 0 must be greater than 1.")]
这应该可以满足您的需求,并且可以避免使用字符串。
【讨论】:
我已经将它用于 Int32 (Int32.MaxValue),没关系,谢谢! 它确实显示了一个愚蠢的验证消息:(The field Fixed price discount must be between 0.01 and 1.79769313486232E+308.
@ppumkin Använd ErrorMessage ,即 [Range(0.0, Double.MaxValue, ErrorMessage = "your error here")]
谢谢雅各布。很好的答案!
@ppumkin 继承自 DataAnnotationsModelValidator 类来自定义错误信息【参考方案2】:
如果您担心字符串看起来不错,可以这样做:
[Range(0, Double.PositiveInfinity)]
这将有一个默认的错误消息:
字段 SuchAndSuch 必须介于 0 和 Infinity 之间。
【讨论】:
这是最好的答案,恕我直言,没有扩展,没有看似随机的字符串/数字,没有自定义代码,以及合理合理的错误消息。 哇,这太酷了。与使用 PositiveInfinity 而不是 maxvalue 相比,还有其他优势吗? @Enrico 有意义的信息看起来是一大优势。有_dis_advantages吗?我想知道如果您输入的值对于您的数据库来说太大并且小于无穷大,会发生什么?在实践中,我怀疑我永远不会担心它。【参考方案3】:似乎别无选择,只能手动输入最大值。我希望有某种类型的重载,您不需要指定一个。
[Range(typeof(decimal), "0", "79228162514264337593543950335")]
public decimal Price get; set;
【讨论】:
这段代码看起来很糟糕。我建议通过 nuget 使用dataannotationsextensions.org,正如@Nicolai Schlenzig 回答的那样。使用[Min(0)]
- 这也有更好的验证信息。我建议更新您的答案
我对其进行了更新,使其与此处的最佳答案相同,因为 OP 并没有改变主意,哈哈
上面的答案(@Jordan 和@Jacob)更合适。特别是因为我们谈论的是价格。我知道很多时候交易必须使用十进制值进行,但没有任何价格 1.234 美元,或者至少在大多数情况下您不想向用户显示。
@AnastasiosSelmanis,我同意你的观点,期待你说“但没有任何价格 1.234 美元”的部分。您假设使用美元,即使那样,当您将其用于外汇时(尽管 OP 未在此处提及),美元确实会进入更多小数位。 =)【参考方案4】:
你可以使用:
[Min(0)]
这将强制要求最小值 0(零),并且没有最大值。
您需要DataAnnotationsExtensions 才能使用它。
【讨论】:
不,我认为这不正确。它不是标准 MVC3 框架的一部分,它来自 Data Annotations Extensions dataannotationsextensions.org。请提供 MSDN 链接。 不 - 绝对不是 MVC 3 的一部分 :( 但是该库是一个很好的扩展有任何方式:) 不是 MVC3 的一部分,但并不重要。如果你想在客户端进行验证,你只需要使用 DataAnnotationsExtensions.MVC3 包。这两个包在 nuget 上可用。我认为这是最好的方法,因为您没有愚蠢的错误消息,或者每次要验证正整数或小数时都不需要重新定义错误消息(这很常见)。【参考方案5】:如果您使用价格,我相信您可以放心地假设没有任何东西会花费超过 1 万亿美元。
我会使用:
[Range(0.0, 1000000000000)]
或者如果你真的需要它,只需粘贴 Decimal.MaxValue
的值(不带逗号):79,228,162,514,264,337,593,543,950,335
如果您不是来自津巴布韦,其中任何一个都可以很好地工作。
【讨论】:
为什么不只是[Range(0.0,Decimal.MaxValue)]
?
不会编译,Decimal.MaxValue 不是常数。
那个常量很麻烦,错误文本引用资源文件并不容易
现在您假设货币是美元,而不是日元或其他货币。
@jfar Decimal.MaxValue 是一个常数。只是 Range 没有过载来容纳小数。【参考方案6】:
您可以使用自定义验证:
[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 );
【讨论】:
【参考方案7】:使用范围
[Range(typeof(Decimal), "0", "9999", ErrorMessage = "0 must be a decimal/number between 1 and 2.")]
[Range(typeof(Decimal),"0.0", "1000000000000000000"]
希望对你有帮助
【讨论】:
【参考方案8】:我打算尝试这样的事情:
[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.")]
【讨论】:
您的错误信息应该是“大于或等于”。 好收获。已添加。【参考方案9】:[Range(0.01,100000000,ErrorMessage = "价格必须大于零!")]
【讨论】:
【参考方案10】:我会输入decimal.MaxValue.ToString()
,因为这是十进制类型的有效上限,它相当于没有上限。
【讨论】:
问题是它不是一个常数。您将收到此错误:属性参数必须是属性参数类型的常量表达式、typeof 表达式或数组创建表达式 正如我在下面指出的,但显然它并没有得到某人的赞赏。以上是关于如何使用范围数据注释属性指定最小但没有最大小数?的主要内容,如果未能解决你的问题,请参考以下文章