我为整数创建了一个自定义验证器,以检查大于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
的定义和文档,但仍然迷失了方向。
抱怨的错误是什么?
在这种情况下,是否还有其他方法可以验证Decimal大于0?
答案 0 :(得分:0)
@JonathonChase在评论中回答了这个问题,我想我会在这里用修改后的代码示例来完成答案,以防有人偶然遇到同样的问题。
抱怨的错误是什么?
由于调用[GreaterThanDecimal(0)]
试图将小数作为属性参数传递,因此CLR不支持此方法。参见use decimal values as attribute params in c#?
解决方案
将参数类型更改为double或int
public class GreaterThanDecimal : ValidationAttribute
{
private readonly decimal _val;
public GreaterThanDecimal(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;
}
}
答案 1 :(得分:0)
使用范围属性。也适用于小数。
[Range(0.01, 99999999)]