我有以下代码来测试类属性:
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中有一些问题我不知道吗
答案 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()
参数并根据其模式进行检查。