我的sql server 2008里面有一列Decimal(18,2)
。但是在实体框架中,我可以在我的asp.net MVC Web应用程序中应用于此属性的最佳数据注释验证是什么?
答案 0 :(得分:51)
小数没有明确的数据注释,因此您需要使用两个单独的注释来添加约束。
[RegularExpression(@"^\d+\.\d{0,2}$")]
此正则表达式将确保该属性最多包含两位小数。
[Range(0, 9999999999999999.99)]
假设您不接受任何负数。否则,请将0
替换为-9999999999999999.99
。
[RegularExpression(@"^\d+\.\d{0,2}$")]
[Range(0, 9999999999999999.99)]
public decimal Property { get; set; }
答案 1 :(得分:14)
我认为@ jumpingcode的答案可以合并为一个RegularExpressionAttribute
。
[RegularExpression(@"^(0|-?\d{0,16}(\.\d{0,2})?)$")]
public decimal Property
{
get;
set;
}
这可用于任何precision
和scale
。 16替换为precision
- scale
,而2替换为scale
。正则表达式应匹配输入的数字,如###
,0.##
,.##
,0
和###.##
以及负值。
答案 2 :(得分:4)
这似乎是正确的答案(上述答案要么限制可以插入到Decimal(18,2)数据类型的有效数字,要么将编译错误应用到您的代码中 - 请自行确认):
一起使用以下两个约束:
两个小数点
[RegularExpression(@"^\d+.?\d{0,2}$", ErrorMessage = "Invalid Target Price; Maximum Two Decimal Points.")]
最多18位
[Range(0, 9999999999999999.99, ErrorMessage = "Invalid Target Price; Max 18 digits")]
答案 3 :(得分:3)
对于某些人可能认为更具可读性的方法,您可以覆盖DbContext的OnModelCreating方法来设置精度,如下所示:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<YourEntity>()
.Property(x => x.TheProprty)
.HasPrecision(18, 2);
}
优势:强类型与自定义正则表达式
缺点:只需扫描就无法在课堂上看到它
答案 4 :(得分:2)
下面是@Schmalls示例(并注释将其重新构建为属性),我创建了一个工作示例(使用C#6字符串插值):
public class PrecisionAndScaleAttribute : RegularExpressionAttribute
{
public PrecisionAndScaleAttribute(int precision, int scale) : base($@"^(0|-?\d{{0,{precision - scale}}}(\.\d{{0,{scale}}})?)$")
{
}
}
用法:
[PrecisionAndScale(6, 2, ErrorMessage = "Total Cost must not exceed $9999.99")]
public decimal TotalCost { get; set; }
答案 5 :(得分:1)
[Range(1,(double) decimal.MaxValue, ErrorMessage="value should be between{1} and {2}."]
答案 6 :(得分:0)
我几乎完全使用(b / c简单而有效)
[Range(typeof(decimal), "0", "1")]
public decimal Split { get; set; }
然后,如果我需要转换回双倍,我添加一个转换
(double)model.Split
答案 7 :(得分:0)
如果您编写“列”注释,将可以正常工作
[Required]
[Column(TypeName = "decimal(18, 6)")]
public decimal Foo { get; set; }