我正在开发一个带有客户购买模型的 REST API。我已经应用了一些验证,但我发现对十进制类型的属性的验证不起作用,但是对字符串类型的属性的验证成功了。
我的行为是,如果不添加属性,例如总计,则不会应用验证,并且此属性采用小数类型的默认值,即 0.0
也就是说,我有以下模型:
public class CustomerPurchase : BaseEntity
{
[Required(ErrorMessage = "PurchaseFolioRequired")]
public string Folio { get; set; }
[Required(ErrorMessage = "PurchaseIvaRequired")]
[Range(typeof(Decimal), "0", "1000000000000000000", ErrorMessage = "PurchaseInvalidVat")]
public decimal Iva { get; set; }
[Required(ErrorMessage = "PurchaseSubtotalRequired")]
[Range(typeof(Decimal), "0", "1000000000000000000", ErrorMessage = "PurchaseInvalidSubtotal")]
public decimal Subtotal { get; set; }
[Required(ErrorMessage = "PurchaseTotalRequired")]
[Range(typeof(Decimal), "0", "1000000000000000000", ErrorMessage = "PurchaseInvalidTotal")]
public decimal Total { get; set; }
[Required(ErrorMessage = "PurchaseTotalLettersRequired")]
public string TotalLetters { get; set; }
[Required(ErrorMessage = "PurchaseEmployeeRequired")]
[BsonRepresentation(BsonType.ObjectId)]
public string UserId { get; set; }
[Required(ErrorMessage = "PurchaseProductRequired")]
[MinLength(1, ErrorMessage = "PurchaseProductRequired")]
public ProductSold[] Products { get; set; }
[Required(ErrorMessage = "PurchasePaymentRequired")]
[MinLength(1, ErrorMessage = "PurchasePaymentRequired")]
public Payment[] Payments { get; set; }
[Required(ErrorMessage = "PurchaseClientRequired")]
public Client Client { get; set; }
}
这个应用程序是错误的?,或者有一种方法可以严格应用这个验证。
感谢您的阅读
decimal
是一个 值类型,因此它始终具有默认值 - 在本例中为 0
,因此它始终通过您的验证。所以你可以让它们可空:
public class CustomerPurchase : BaseEntity
{
....
[Required(ErrorMessage = "PurchaseIvaRequired")]
[Range(typeof(Decimal), "0", "1000000000000000000", ErrorMessage = "PurchaseInvalidVat")]
public decimal? Iva { get; set; }
...
}
的文档也非常清楚:
属性指定验证表单上的字段时,该字段必须包含值。如果属性为RequiredAttribute
、包含空字符串 ("") 或仅包含空白字符,则会引发验证异常。null
UPD
在 C# 11 中添加
required
关键字,您可以尝试使用它来解决问题:
public class CustomerPurchase : BaseEntity
{
....
public required decimal Iva { get; set; }
...
}
你可以这样编码:
[Range(1, 100)]
[DataType(DataType.Currency)]
[Column(TypeName = "decimal(18, 2)")]
public decimal Price { get; set; }