2010-10-30 3 views
3

относящиеся к этому questionПользовательские DataTypeAttribute проверка не вызывая правильно

Я создал свой собственный 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. Есть идеи?

ответ

0

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

«DataTypeAttribute по умолчанию не выполняет никаких проверок, но это влияет на шаблоны, касающиеся представления данных». взяты из this question

Пример:

[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; 
    } 
} 
+0

Изменение моего примера на расширение от ValidationAttribute не помогает. Имейте в виду, что DataTypeAttribute уже распространяется на ValidationAttribute. – manu08

0

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

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

Вы хотите изменить свой тест на это, обратите внимание, что мы устанавливаем MemberName в ValidationContext и сообщаем Validator для проверки свойства 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

'только обязательные поля будут проверены, а не любая другая проверка. Ваше заявление неверно, в цитате утверждается, что валидаторы не выполняются рекурсивно. Это означает, что если у вас есть класс со сложным типом, который сам обладает свойствами, отмеченными атрибутами проверки, эти ** внутренние ** свойства не проверяются. –

1

Метод 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); 
}