gpt4 book ai didi

c# - 自定义 DataAnnotation IsValid 未调用

转载 作者:太空狗 更新时间:2023-10-29 21:16:34 26 4
gpt4 key购买 nike

背景

大家好,

基本上,我在 .NET Core 类库中编写自定义数据批注,以验证 IEnumerable 是否至少具有一定数量的元素。


问题

出于某种原因,在运行验证时,永远不会调用 IsValid。我已经发现了一些关于这个问题的其他 SO 问题,但他们都有一个与我不同的问题(基本上,他们实际上并没有验证他们的对象)。但是,我正在验证我的对象(调用 Validator.TryValidateObject(...)),但从未调用 IsValid。

如果我使用任何开箱即用的验证属性(例如 Required),它会按预期运行。


代码

MinElementsAttribute.cs

public class MinElementsAttribute : ValidationAttribute
{
readonly int minElements;

public MinElementsAttribute(int minElements) : base($"Collection must have a size of at least {minElements}")
{
this.minElements = minElements;
}

protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var list = value as IEnumerable<object>;

if(list == null || list.Count() < this.minElements)
{
return new ValidationResult(this.FormatErrorMessage(validationContext.DisplayName));
}

return ValidationResult.Success;
}
}

MinElementsTests.cs

[Fact]
public void TestValidation()
{
var validationResults = new List<ValidationResult>();
var testObject = new TestObject();

// Should be false since I have not added anything to the list
var isValid = Validator.TryValidateObject(testObject, new ValidationContext(testObject), validationResults);

// Fails since isValid comes back as true because IsValid on MinElementsAttribute is never called
Assert.False(isValid);
Assert.NotEmpty(validationResults);
}

internal class TestObject
{
public TestObject()
{
this.StringList = new List<string>();
}

[MinElements(3)]
public List<string> StringList { get; set; }
}

编辑:解决方案

请参阅已接受的解决方案答案。我想添加此内容以同时注意,通过将继承更改为来自 RequiredAttribute 而不是 ValidationAttribute,您可以隐式地强制执行所有对象属性的验证。

最佳答案

Validator.TryValidateObject 类有一些重载方法。你想使用这个:

public static bool TryValidateObject(object instance, ValidationContext validationContext, ICollection<ValidationResult> validationResults, bool validateAllProperties);

来自MSDN article :

validateAllProperties
Type: System.Boolean
true to validate all properties; if false, only required attributes are validated.

您必须使用此方法,因为您的属性不是从 RequiredAttribute 类派生的。

我的样本

var validationResults = new List<ValidationResult>();            
var testObject = new TestObject();
ValidationContext contexts = new ValidationContext(testObject, null, null);
var isValid = Validator.TryValidateObject(testObject, contexts, validationResults, true);

关于c# - 自定义 DataAnnotation IsValid 未调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39608083/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com