RegularExpressionAttribute总是失败

时间:2013-07-31 14:55:56

标签: c# regex

我有以下代码来测试类属性:

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”时,验证失败。我使用Regex类进行单元测试,如下所示:

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

以上测试通过。 我在这做错了什么?在RegularExpressionAttribute中有一些问题我不知道吗

2 个答案:

答案 0 :(得分: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时忘记了额外的TryValidateObject(validateAllProperties)。 true指定验证器以检查每个属性和每个ValidationAttribute

我针对您的用例Lot = "a12345"测试了这个用例{不会返回错误消息)v。 Lot = "a1234$"确实会返回错误消息。

希望这有帮助。

答案 1 :(得分:2)

您使用Validate方法错误。

而不是

validationAttr.Validate(objectToValidate,propertyInfo.Name);

使用

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

您必须将属性的实际值传递给Validate方法,因为RegularExpressionAttribute类只会在{{1}上调用.ToString()参数并根据其模式进行检查。

但使用Validator classas Jay already said in his answer.

仍然是最简单的