我有一个班级,其财产全部装饰完毕:
public class AClass
{
[DisplayName("A Property")]
[Phone]
[MinLength(10)]
[MaxLength(10)]
[RegexStringValidator("[0-9]{10}")]
public string AProperty { get; set; }
}
我的另一个班级有
List<T>
这些班级:
public class AnOuterClass
{
[Required]
public string SomeOtherValidatableProperty { get; set; }
public List<AClass> SomeClasses { get; set; }
}
当我运行单元测试来自行验证内部类时,验证按预期工作:
[Test]
public void ErrorIfValueTooShort()
{
var model = new AClass() { AProperty = "123456" };
var validationCtxt = new ValidationContext(model);
var results = new List<ValidationResult>();
var isValid = Validator.TryValidateObject(model, validationCtxt, results, true);
Assert.That(isValid, Is.False);
}
但在实践中(即在单元测试之外),验证会以某种方式失败。这是我的代码的样子:
public bool IsValidModel(AnOuterClass model)
{
var validationCtxt = new ValidationContext(model);
var results = new List<ValidationResult>();
var isValid = Validator.TryValidateObject(model, validationCtxt, results, true);
if (isValid)
{
foreach (var innerModel in model.SomeClasses)
{
var innerValidationContext = new ValidationContext(innerModel);
isValid = Validator.TryValidateObject(innerModel, innerValidationContext, results, true);
if (!isValid)
break;
}
}
return isValid;
}
外层模型有效,但内层模型不有效;无论我在那里输入什么值,它都会返回
IsValid
为 true。为什么会这样?
我的单元测试是在 .NET 6 中进行的,但此代码所在的库是 .NET Standard 2.0。这会是一个问题吗?
在 .NET Fiddle 上测试,似乎运行良好。
https://dotnetfiddle.net/qvAlE1
我建议您使用调试器并查看 foreach 是否确实正在运行。也许模型列表中根本没有 AClass?