如何手动调用 DataAnnotationsModelValidatorProvider(禁用后)

本文关键字:何手动 调用 DataAnnotationsModelValidatorProvider | 更新日期: 2023-09-27 18:21:15

如何在禁用自动验证应用程序范围(https://stackoverflow.com/a/6111442/236255(后手动执行DataAnnotationsModelValidatorProvider的工作。我问是因为

  1. 我喜欢它的工作方式并希望利用它的功能,但是
  2. 我通常需要进行业务验证,除了通常的基于DataAnnotations的验证之外,还需要与数据库通信。我可以在 IValidatableObject.Validate 方法中创建和处置我的 L2S DataContext,但这似乎违背了将服务和数据上下文注入控制器的 DI 模式(与我的函数程序员将我的服务编写为静态方法的诱惑作斗争,这些方法本身创建和处置数据上下文!

请注意,我没有使用任何 MVC 客户端验证功能(我将所有 POST 都作为 ajax 执行,所以我从未看到客户端验证有任何真正的好处(。

如何手动调用 DataAnnotationsModelValidatorProvider(禁用后)

首先,验证:

var validation = new List<ValidationResult>();
bool valid = Validator.TryValidateObject(value, new ValidationContext(value, null, null), validation, validateAllProperties: true);

然后,将结果复制到模型状态:

foreach (var item in validation) {
   IList<string> memberNames = item.MemberNames.ToArray();
   if (memberNames.Count > 0) {
      for (int i = 0; i < memberNames.Count; i++)
         controller.ModelState.AddModelError(memberNames[i] ?? "", item.ErrorMessage);
   } else {
      controller.ModelState.AddModelError("", item.ErrorMessage);
   }
}