Проверка с использованием атрибутов - PullRequest
9 голосов
/ 28 октября 2011

У меня есть, скажем, такой простой класс:

public class User
{
  [Required(AllowEmptyStrings = false, ErrorMessage="EmailIsRequired"]
  public string EmailAddress { get; set; }
}

Я знаю, как использовать Validator.TryValidateProperty и Validator.TryValidateObject в пространстве имен System.ComponentModel.DataAnnotations. Чтобы это работало, вам необходим фактический экземпляр объекта, который вы хотите проверить.

Но теперь я хочу проверить определенное значение без экземпляра класса User, например:

TryValidateValue(typeof(User), "EmailAddress", "test@test.com");

Цель состоит в том, чтобы я хотел проверить значение перед тем, как на самом деле создавать экземпляр самого объекта (причина в том, что я разрешаю создавать только действительные сущности домена). Поэтому на самом деле я хочу использовать атрибуты проверки классов, а не экземпляров.

Есть идеи, как это можно сделать?

Спасибо!

РЕДАКТИРОВАТЬ: тем временем я решил не использовать аннотации данных, а вместо этого использовать http://fluentvalidation.codeplex.com, чтобы валидация перемещалась за пределы сущностей. Этот способ проверки может быть запущен из сущностей, а также из моих командных обработчиков. Сама проверка также выглядит более читабельной благодаря беглой записи.

1 Ответ

17 голосов
/ 28 октября 2011

Вот пример того, как вы можете использовать TryValidateValue метод:

public class User
{
    [Required(AllowEmptyStrings = false, ErrorMessage = "EmailIsRequired")]
    public string EmailAddress { get; set; }
}

class Program
{
    static void Main()
    {
        var value = "test@test.com";

        var context = new ValidationContext(value, null, null);        
        var results = new List<ValidationResult>();
        var attributes = typeof(User)
            .GetProperty("EmailAddress")
            .GetCustomAttributes(false)
            .OfType<ValidationAttribute>()
            .ToArray();

        if (!Validator.TryValidateValue(value, context, results, attributes))
        {
            foreach (var result in results)
            {
                Console.WriteLine(result.ErrorMessage);
            }
        }
        else
        {
            Console.WriteLine("{0} is valid", value);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...