C# 如何根据DataAnnotation中的另一个属性验证属性
考虑到这两个属性,我有一个:C# 如何根据DataAnnotation中的另一个属性验证属性,c#,c#-4.0,data-annotations,C#,C# 4.0,Data Annotations,考虑到这两个属性,我有一个: public class Test { [Required(ErrorMessage = "Please Enetr Age")] public System.Int32 Age { get; set; } [Required(ErrorMessage = "Choose an option")] public System.Boolean IsOld { get; set; } } 当用户为Age输入示例15并为IsOld选择“Y
public class Test
{
[Required(ErrorMessage = "Please Enetr Age")]
public System.Int32 Age { get; set; }
[Required(ErrorMessage = "Choose an option")]
public System.Boolean IsOld { get; set; }
}
当用户为
Age
输入示例15并为IsOld
选择“Yes
”时,我返回一个异常,该异常纠正Age
或IsOld
。我使用了CustomValidation
,但由于我的验证必须是静态的,所以我无法访问其他属性。如何通过DataAnnotation
实现这一点?您可以向类本身添加数据批注(自定义验证器)。在validation属性的isValid方法中,您应该能够强制转换对象并测试需要满足的值
例如:
using System;
using System.Collections.ObjectModel;
using System.ComponentModel.DataAnnotations;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
// setup test object
Test t = new Test() { Age = 16, IsOld = true };
// store validation results
Collection<ValidationResult> validationResults = new Collection<ValidationResult>();
// run validation
if (Validator.TryValidateObject(t, new ValidationContext(t, null, null), validationResults, true))
{
// validation passed
Console.WriteLine("All items passed validation");
}
else
{
// validation failed
foreach (var item in validationResults)
{
Console.WriteLine(item.ErrorMessage);
}
}
Console.ReadKey(true);
}
}
[TestValidation(ErrorMessage = "Test object is not valid")]
public class Test
{
public int Age { get; set; }
public bool IsOld { get; set; }
}
public class TestValidation : ValidationAttribute
{
public override bool IsValid(object value)
{
bool isValid = false;
Test testVal = value as Test;
if (testVal != null)
{
// conditional logic here
if ((testVal.Age >= 21 && testVal.IsOld) || (testVal.Age < 21 && !testVal.IsOld))
{
// condition passed
isValid = true;
}
}
return isValid;
}
}
}
使用系统;
使用System.Collections.ObjectModel;
使用System.ComponentModel.DataAnnotations;
命名空间控制台应用程序1
{
班级计划
{
静态void Main(字符串[]参数)
{
//设置测试对象
Test t=new Test(){Age=16,IsOld=true};
//存储验证结果
集合验证结果=新集合();
//运行验证
if(Validator.TryValidateObject(t,新的ValidationContext(t,null,null),validationResults,true))
{
//通过验证
Console.WriteLine(“通过验证的所有项目”);
}
其他的
{
//验证失败
foreach(validationResults中的var项)
{
Console.WriteLine(item.ErrorMessage);
}
}
Console.ReadKey(true);
}
}
[TestValidation(ErrorMessage=“测试对象无效”)]
公开课考试
{
公共整数{get;set;}
公共bool IsOld{get;set;}
}
公共类TestValidation:ValidationAttribute
{
公共覆盖布尔值有效(对象值)
{
bool isValid=false;
Test testVal=作为测试的值;
if(testVal!=null)
{
//这里的条件逻辑
if((testVal.Age>=21&&testVal.IsOld)| |(testVal.Age<21&&testVal.IsOld))
{
//情况过去了
isValid=true;
}
}
返回有效;
}
}
}
在我看来,如果这些值中的任何一个未提交,它将抛出异常。你还想要什么??事实上,它不是很了解你在寻找什么,我说如果所有这些都是红色的???使用输入15作为年龄并选择IsOld。你的意思是说如果有人在你的Age
属性中输入一个值,然后,IsOld
本身被设置为true??你是程序员吗?首先:这是一个典型的例子,现实世界中可能不存在任何这样的情况。第二:用户输入了年龄和IsOld