gpt4 book ai didi

c# - 返回多个验证异常

转载 作者:太空狗 更新时间:2023-10-29 17:59:22 24 4
gpt4 key购买 nike

一直在尝试将服务器端 DataAnnotation 验证合并到我的项目中,我发现 DataAnnotations 有它自己的错误类型,即 ValidationException。不过,我的问题是它一次只返回一个验证错误,因此如果 3 个属性验证失败,则只会抛出第一个。我正在寻找一种方法将所有错误作为异常抛出,而不是通知用户/开发人员验证失败,它会一次性说明哪些属性/字段验证失败。

我找到了 Validator.TryValidateObject(...) 方法,但它只是填充 ValidationResults 并让开发人员可以选择是否抛出异常。我目前实现的是遍历 ValidationResults 以从中创建一个 ValidationExceptions 列表,将该列表包装到一个 AggregateException 中,然后在其 InnerExceptions 中抛出另一个带有 AggregateException 的 ValidationException。

ValidationContext validationContext = new ValidationContext(entity, null, null);
List<ValidationResult> validationResults = new List<ValidationResult>();

bool isValid = Validator.TryValidateObject(entity, validationContext, validationResults, true);

if (!isValid)
{
List<ValidationException> validationErrors = new List<ValidationException>();
foreach (ValidationResult validationResult in validationResults)
{
validationErrors.Add(new ValidationException(validationResult.ErrorMessage);
}

throw new ValidationException("Entity validation failed.", new AggregateException(validationErrors));
}

所以基本上,我的问题是:

  1. 为什么没有同时抛出多个错误的内置方法?也就是说,我是否缺少 DataAnnotation 验证的一些最佳实践?
  2. 是否有更好的方法来实现我想要实现的目标?
  3. 另外...在将 ValidationResult 包装到 ValidationException 中时如何包含成员名称?

最佳答案

回答您的第一个问题:因为每个验证属性都有自己的 IsValid属性(property)与返回public ValidationResult(string errorMessage, IEnumerable<string> memberNames);验证结果,您可以从成员名称列表中获取成员名称。因此,每次验证失败的属性返回 isValid。实体具有您在实体属性上应用的验证不是一个好主意。

回答你的第二个问题:您可以创建自己的 ValidationAttribute验证实体的列表:

var validationResults = new List<ValidationResult>();
var validationAttributes = new List<ValidationAttribute>();
validationAttributes.Add(new CustomValidationAttribute(typeof(ClaimValidator), "ValidateClaim"));
var result = Validator.TryValidateValue(claimObject,
new ValidationContext(claimObject, null, null),
validationResults,
validationAttributes);

第三个答案:您可以从 ValidationResult 中获取成员名称:

public ValidationResult(string errorMessage, IEnumerable<string> memberNames)

关于c# - 返回多个验证异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21982347/

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