问题: 除了使用 Validator.TryValidateObject 之外,还有其他方法可以验证 DataAnnotations

为什么:
如果您希望它验证 IValidatableObject ,则无法指定 Validator 。如果仅在对象有效时才对其进行验证,那将是可以的。

我要完成的任务: 获取所有验证结果的列表

如果您查看 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/

10-13 06:55