как проверить свойство в соответствии с другим свойством в DataAnnotation - PullRequest
4 голосов
/ 27 ноября 2011

Предположим, у меня есть два следующих свойства:

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; }
}

Когда пользователь вводит, например, 15 для Age и выбирает "Yes" для IsOld, я возвращаю исключение, которое корректно Age или IsOld.Я использовал CustomValidation для него, но поскольку моя проверка должна быть статической, я не могу получить доступ к другим свойствам.Как я могу сделать это с помощью DataAnnotation?

1 Ответ

7 голосов
/ 27 ноября 2011

Вы можете добавить аннотации данных (Custom Validator) к самому классу. В методе 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;
        }
    }
}
...