gpt4 book ai didi

c# - 从 Validator.TryValidateObject 获取所有 ValidationResults

转载 作者:行者123 更新时间:2023-11-30 12:46:11 25 4
gpt4 key购买 nike

问题:除了使用 Validator.TryValidateObject

之外,还有其他验证 DataAnnotations 的方法吗?

原因:无法指定验证器是否要验证 IValidatableObject。如果它仅在对象有效时才对其进行验证,那也没关系。

我想要完成的事情:获取所有验证结果的列表

如果您查看来自 Validator.TryValidateObject 的反编译代码,请深入了解 GetObjectValidationErrors。你会得到这个(我已经重新格式化以便于阅读)

private static IEnumerable<Validator.ValidationError> GetObjectValidationErrors(object instance, ValidationContext validationContext, bool validateAllProperties, bool breakOnFirstError)
{
var list = new List<Validator.ValidationError>();
list.AddRange(Validator.GetObjectPropertyValidationErrors(instance, validationContext, validateAllProperties, breakOnFirstError));
if (list.Any())
return list; //Doesn't continue if errors are found

var validationAttributes = Validator._store.GetTypeValidationAttributes(validationContext);
list.AddRange(Validator.GetValidationErrors(instance, validationContext, validationAttributes, breakOnFirstError));
if (list.Any(()))
return list; //Doesn't continue if errors are found

var validatableObject = instance as IValidatableObject;
if (validatableObject != null)
{
foreach (ValidationResult validationResult in Enumerable.Where<ValidationResult>(validatableObject.Validate(validationContext), (Func<ValidationResult, bool>) (r => r != ValidationResult.Success)))
list.Add(new Validator.ValidationError((ValidationAttribute) null, instance, validationResult));
}
return list;
}

如您所见,它在获得一组验证结果后立即中断。

最佳答案

您是否尝试过查看 ControllerContext 中的 ModelState 属性?假设您有一个名为 Index 的 Controller 操作,它接受已发布的模型。在此方法中,您可以检查 ModelState 属性并使用一点 LINQ 魔法,为您的模型获取所有验证错误。这种方法不会告诉您验证错误来自何处。只是一条文本错误消息,可能还有异常。

public ActionResult Index(MyModel model)
{
if( !ModelState.IsValid){
var errors = this.ModelState.Values.SelectMany(x => x.Errors);
}

return View();
}

关于c# - 从 Validator.TryValidateObject 获取所有 ValidationResults,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21027629/

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