Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何根据DataAnnotation中的另一个属性验证属性_C#_C# 4.0_Data Annotations - Fatal编程技术网

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