2013-07-31 6 views
1

я следующий код, чтобы проверить свойство класса:RegularExpressionAttribute всегда терпит неудачу

public class RegExtTest 
{ 
    [RegularExpression(@"^[A-z0-9]{6}$", ErrorMessage = "Lot must be 6 characters alphanumeric")] 
    public string Lot { get; set; } 
} 

и универсальный метод расширения для проверки класса, содержащий один или несколько из этих объектов

public static IEnumerable<string> ValidateObject(this object objectToValidate) 
    { 
     var result = new List<string>(); 
     var objType = objectToValidate.GetType(); 
     var properties = objType.GetProperties(); 
     foreach (var propertyInfo in properties) 
     { 
      var attrs = propertyInfo.GetCustomAttributes(typeof(ValidationAttribute), true); 
      foreach (var attribue in attrs) 
      { 
       try 
       { 
        var validationAttr = attribue as ValidationAttribute; 
        if (validationAttr != null) 
        { 
         validationAttr.Validate(objectToValidate,propertyInfo.Name); 
        } 
       } 
       catch (Exception e) 
       { 
        if (e is ValidationException) 
         result.Add(e.Message); 
       } 
      } 
     } 

     return result; 
    } 

Однако проверка терпит неудачу, когда Значение равно «a23456». I, с использованием класса Regex следующим образом:

var isMatch = Regex.IsMatch(lbp.Lot, "^[A-z0-9]{6}$"); 

Вышеуказанный тест проходит. Что я здесь делаю неправильно? Есть ли какие-то ключи в RegularExpressionAttribute, которых я не знаю

+0

Вы уверены, что [A-Z] является действительным ?? Разве вы не хотите использовать [A-Za-z0-9]? –

+0

Что значит «проверка не удается», когда «a23456» проходит? Это 6-значная буквенно-цифровая строка, поэтому она должна пройти, не так ли? –

ответ

2

Вы используете метод Validate неправильно.

Вместо

validationAttr.Validate(objectToValidate,propertyInfo.Name); 

использование

validationAttr.Validate(propertyInfo.GetValue(objectToValidate, null),propertyInfo.Name); 

Вы должны пройти фактическое значение имущества к методу Validate, так как RegularExpressionAttribute класс будет просто вызвать .ToString() на value аргумента и проверьте его на соответствие шаблону.

Но это все-таки проще всего использовать Validator class, as Jay already said in his answer.

+0

tx. это было пятно на. Я использую v3.5, поэтому не могу использовать валидатор. – ASR

+0

Еще одна вещь, которую я предлагаю, - это явно вылавливать 'ValidationException' в вашей' try ... catch'. Как и любые другие ошибки, которые были выброшены, проглотили бы! – Jay

+0

Я понимаю, но я не помещаю все другие ошибки в журнал. это был просто прототип. окончательная версия регистрирует все другие исключения – ASR

2

Вы можете упростить реализацию, используя Validator. См. here для более подробной информации.

Это должно сделать трюк.

public static IEnumerable<string> ValidateObject(this object model) 
{ 
    var context = new ValidationContext(model); 
    var results = new List<ValidationResult>(); 
    Validator.TryValidateObject(model, context, results, true); 
    return results.Select(r => r.ErrorMessage); 
} 

Обновление

Я первоначально забыл дополнительные true (validateAllProperties) в конце вызова TryValidateObject. В true указан валидатор для проверки каждого свойства и каждого ValidationAttribute.

Я протестировал это против вас, используя случай Lot = "a12345", который работает (не возвращает сообщение об ошибке) v.s. Lot = "a1234$", который возвращает сообщение об ошибке.

Надеюсь, это поможет.

+0

Извините. Забыл упомянуть, что я нахожусь в .net 3.5 – ASR

Смежные вопросы