Пользовательский атрибут DataTypeAttribute неправильно запускает проверку - PullRequest
3 голосов
/ 30 октября 2010

В связи с этим вопрос

Я создал свой собственный DateValidationAttibute, чтобы убедиться, что строка имеет допустимый формат даты (например, MM / DD / YYYY)

[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)]
public class DateValidationAttribute : DataTypeAttribute
{
    public DateValidationAttribute() : base(DataType.Date){}

    //MM/DD/YYYY, MM-DD-YYYY
    public override bool IsValid(object value)
    {
        //validation logic
    }
}

Я пытаюсь проверить этот атрибут с помощью этого кода

    [Test]
    public void Test()
    {
        var invalidObject = new TestValidation {DateField = "bah"};
        var validationContext = new ValidationContext(invalidObject, null, null);
        var validationResults = new System.Collections.Generic.List<ValidationResult>();

        bool result = Validator.TryValidateObject(invalidObject, validationContext, validationResults);

        Assert.IsFalse(result);
        Assert.AreEqual(1, validationResults.Count);
    }

    private class TestValidation
    {
        [DateValidation(ErrorMessage = "Invalid Date!")]
        public string DateField { get; set; }
    }

К сожалению, это не работает.Я установил точку останова в конструкторе DateValidationAttribute и в методе IsValid.Он определенно попадает в конструктор, но никогда не попадает в метод IsValid.Есть идеи?

Ответы [ 3 ]

1 голос
/ 22 июля 2014

Метод TryValidateObject имеет перегрузку, которая может принимать логическое значение validateAllProperties в качестве четвертого параметра. Если не указано иное, по умолчанию используется значение false, когда проверяются только некоторые атрибуты.

[Test]
public void Test()
{
    var invalidObject = new TestValidation {DateField = "bah"};
    var validationContext = new ValidationContext(invalidObject, null, null);
    var validationResults = new System.Collections.Generic.List<ValidationResult>();

    //Validate all attributes
    bool result = Validator.TryValidateObject(invalidObject, validationContext, validationResults, true);

    Assert.IsFalse(result);
    Assert.AreEqual(1, validationResults.Count);
}
0 голосов
/ 04 марта 2011

От MSDN ссылка , обратите внимание, что будут проверены только обязательные поля, НЕ любая другая проверка.

Этот метод оценивает каждый экземпляр ValidationAttribute, которыйпривязан к типу объекта.Он также проверяет, предоставляется ли каждое свойство, помеченное с помощью RequiredAttribute. Он не рекурсивно проверяет значения свойств объекта .

Вы хотите изменить свой тест на это, обратите внимание, что мы устанавливаем MemberName в ValidationContext и сообщаемВалидатор для проверки свойства invalidObject.DateField.

[Test]
public void Test()
{
     var invalidObject = new TestValidation { DateField = "bah" };
     var validationContext = new ValidationContext(invalidObject,null , null){MemberName = "DateField"};
     var validationResults = new System.Collections.Generic.List<ValidationResult>();

     var result = Validator.TryValidateProperty(invalidObject.DateField, validationContext, validationResults);

    Assert.IsFalse(result);
    Assert.AreEqual(1, validationResults.Count);
}
0 голосов
/ 30 октября 2010

Я никогда не пытался создавать атрибуты ValidationAttributes с использованием класса DataTypeAttribute, и я не уверен, что это неправильно, но расширение класса ValidationAttribute всегда работало для меня.

"DataTypeAttribute не работаетвыполнить любую проверку по умолчанию. Но это влияет на шаблоны относительно того, как данные представлены. "взято из этого вопроса

Пример:

[AttributeUsage(AttributeTargets.Field,  AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public sealed class MyCustomAttribute : ValidationAttribute
{
  public MyCustomAttribute()
    : base("Custom Error Message: {0}")
  {
  }

  public override bool IsValid(object value)
  {
    return true;
  }
}
...