【发布时间】:2019-01-23 16:47:52
【问题描述】:
我为整数创建了一个自定义验证器来检查大于 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 的小数?
【问题讨论】:
-
我认为在这种情况下您可以使用 Range 属性。无需为此实施自定义验证。希望能帮到你,我的朋友!
-
@Tomato32 谢谢。但是对于 Range,我需要定义最小值和最大值。定义大于 0 的最小最小值会很棘手,特别是对于小数。另外我不想设置最大限制约束。这就是为什么我只是试图将其定义为 - 大于 0 的小数。
-
有什么理由不能使用 double/int 来设置要比较的初始值吗?如果您只是检查它是否大于 0,那么您的属性可以接受一个整数参数来与小数进行比较。
-
@JonathonChase 谢谢。从您共享的链接中读取 - “基本类型不是基本类型的小数,因此不能在元数据中表示,这会阻止它成为属性参数。” - 这个错误现在完全有道理了。是的,我可以把它改成双倍,它可以工作。
标签: c# .net validation c#-5.0 custom-validators