如何使用 ValidationAttribute 验证小数是否大于零
How to validate a decimal to be greater than zero using ValidationAttribute
我为整数创建了一个自定义验证器来检查大于 0 的输入。它工作正常。
整数的自定义验证
using System;
using System.ComponentModel.DataAnnotations;
public class GeaterThanInteger : ValidationAttribute
{
private readonly int _val;
public GeaterThanInteger(int val)
{
_val = val;
}
public override bool IsValid(object value)
{
if (value == null) return false;
return Convert.ToInt32(value) > _val;
}
}
调用代码
[GeaterThanInteger(0)]
public int AccountNumber { get; set; }
自定义十进制验证器
我正在尝试为小数创建类似的验证器以检查大于 0 的输入。但是我这次 运行 遇到了编译器错误。
public class GreaterThanDecimal : ValidationAttribute
{
private readonly decimal _val;
public GreaterThanDecimal(decimal val)
{
_val = val;
}
public override bool IsValid(object value)
{
if (value == null) return false;
return Convert.ToDecimal(value) > _val;
}
}
调用代码
[GreaterThanDecimal(0)]
public decimal Amount { get; set; }
编译器错误(指向 [GreaterThanDecimal(0)])
An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type
我尝试了几种组合,
[GreaterThanDecimal(0M)]
[GreaterThanDecimal((decimal)0)]
但是不起作用。
我查看了 ValidationAttribute
定义和文档,但我仍然迷路了。
抱怨的错误是什么?
在这种情况下,是否有任何替代方法来验证大于 0 的 Decimal?
@JonathonChase 在评论中回答了它,我想我会在这里用修改后的代码示例来完成答案,以防有人遇到同样的问题。
抱怨什么错误?
因为调用 [GreaterThanDecimal(0)]
试图将小数作为属性参数传递,所以 CLR 不支持。参见 use decimal values as attribute params in c#?
解决方案
将参数类型改为double或int
public class GreaterThanDecimalAttribute : ValidationAttribute
{
private readonly decimal _val;
public GreaterThanDecimalAttribute(double val) // <== Changed parameter type from decimal to double
{
_val = (decimal)val;
}
public override bool IsValid(object value)
{
if (value == null) return false;
return Convert.ToDecimal(value) > _val;
}
}
使用范围属性。也适用于小数。
[Range(0.01, 99999999)]
我为整数创建了一个自定义验证器来检查大于 0 的输入。它工作正常。
整数的自定义验证
using System;
using System.ComponentModel.DataAnnotations;
public class GeaterThanInteger : ValidationAttribute
{
private readonly int _val;
public GeaterThanInteger(int val)
{
_val = val;
}
public override bool IsValid(object value)
{
if (value == null) return false;
return Convert.ToInt32(value) > _val;
}
}
调用代码
[GeaterThanInteger(0)]
public int AccountNumber { get; set; }
自定义十进制验证器
我正在尝试为小数创建类似的验证器以检查大于 0 的输入。但是我这次 运行 遇到了编译器错误。
public class GreaterThanDecimal : ValidationAttribute
{
private readonly decimal _val;
public GreaterThanDecimal(decimal val)
{
_val = val;
}
public override bool IsValid(object value)
{
if (value == null) return false;
return Convert.ToDecimal(value) > _val;
}
}
调用代码
[GreaterThanDecimal(0)]
public decimal Amount { get; set; }
编译器错误(指向 [GreaterThanDecimal(0)])
An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type
我尝试了几种组合,
[GreaterThanDecimal(0M)]
[GreaterThanDecimal((decimal)0)]
但是不起作用。
我查看了 ValidationAttribute
定义和文档,但我仍然迷路了。
抱怨的错误是什么?
在这种情况下,是否有任何替代方法来验证大于 0 的 Decimal?
@JonathonChase 在评论中回答了它,我想我会在这里用修改后的代码示例来完成答案,以防有人遇到同样的问题。
抱怨什么错误?
因为调用 [GreaterThanDecimal(0)]
试图将小数作为属性参数传递,所以 CLR 不支持。参见 use decimal values as attribute params in c#?
解决方案
将参数类型改为double或int
public class GreaterThanDecimalAttribute : ValidationAttribute
{
private readonly decimal _val;
public GreaterThanDecimalAttribute(double val) // <== Changed parameter type from decimal to double
{
_val = (decimal)val;
}
public override bool IsValid(object value)
{
if (value == null) return false;
return Convert.ToDecimal(value) > _val;
}
}
使用范围属性。也适用于小数。
[Range(0.01, 99999999)]