C# 将数据批注验证应用于viewmodel中相同基元数据类型的所有属性

C# 将数据批注验证应用于viewmodel中相同基元数据类型的所有属性,c#,validation,data-annotations,asp.net-mvc-5.2,C#,Validation,Data Annotations,Asp.net Mvc 5.2,我在谷歌搜索了我的场景,但没有找到答案。我想在类型为double的viewmodel类属性中创建正则表达式数据注释验证。因为我有大约20个double类型的属性。因此,我希望创建一个自定义正则表达式验证,并应用于所有双类型属性,而无需在每个属性上显式指定,如: [RegularExpression(@"^[0-9]{1,6}(\.[0-9]{1,2})?$", ErrorMessage ="Invalid Input")] public double Balance { get; set; }

我在谷歌搜索了我的场景,但没有找到答案。我想在类型为
double
的viewmodel类属性中创建正则表达式数据注释验证。因为我有大约20个
double
类型的属性。因此,我希望创建一个自定义正则表达式验证,并应用于所有双类型属性,而无需在每个属性上显式指定,如:

[RegularExpression(@"^[0-9]{1,6}(\.[0-9]{1,2})?$", ErrorMessage ="Invalid Input")]
public double Balance { get; set; }
我期待着这样的事情:

[ApplyRegExpToAllDoubleTypes]
public class MyModel
{
     public double Balance { get; set; }
     public double InstallmentsDue { get; set; }
}

这是一个有趣的问题。以下是如何做到这一点:

定义自定义
ValidationAttribute
并通过设置
AttributeTargets.class
在类级别应用它。在
ValidationAttribute
中,使用反射获取
双属性,然后验证每个属性的值。如果任何验证失败,则返回验证失败消息

[ApplyRegExpToAllDoubleTypes]
公共类MyModel{
公共双平衡{get;set;}
公共双安装due{get;set;}
公共字符串名称{get;set;}
公共整数{get;set;}
}
[AttributeUsage(AttributeTargets.Class,Inherited=false,AllowMultiple=false)]
公共类ApplyRegeExptoAllDoubleTypes:ValidationAttribute{
受保护的重写ValidationResult有效(对象currentObject、ValidationContext ValidationContext){
if(currentObject==null){
返回新的ValidationResult(“对象不能为null”);
}
var properties=validationContext.ObjectType.GetProperties(),其中(x=>x.PropertyType==typeof(double));
foreach(属性中的var属性){
//在这里,我将double属性值与'5'进行比较
//用自定义正则表达式检查替换以下内容
if((双精度)property.GetValue(currentObject)<5){
返回新的ValidationResult(“所有双重属性必须大于5”);
}
}
返回ValidationResult.Success;
}
}

我认为这不可能……Ehrm
double
是一个数字。正则表达式用于字符串。这对你来说怎么样?您的正则表达式正在验证输入是否为带小数点的数字。但是拥有
double
类型的属性已经为您做到了这一点-框架进行检查。为什么您需要在双精度上使用正则表达式?另外,您确定要在
余额
变量上使用
双精度
?我觉得这是钱的问题。而货币最好用十进制表示:是的,您可以对类型的所有属性应用验证。但是问题是关于double上的regex验证(这毫无意义)。@trailmax问题是关于将验证应用于多个属性,而不必注释类中的每个属性。我的答案中没有包含OP的正则表达式,因为它与问题的要点无关(因为我关心的是给定的正则表达式可能是无效的正则表达式)。一般来说,RegularExpression可以用来设置双精度类型的一些验证规则,所以我不确定你的观点是什么。