如何手动调用 DataAnnotationsModelValidatorProvider(禁用后)
本文关键字:何手动 调用 DataAnnotationsModelValidatorProvider | 更新日期: 2023-09-27 18:21:15
如何在禁用自动验证应用程序范围(https://stackoverflow.com/a/6111442/236255(后手动执行DataAnnotationsModelValidatorProvider
的工作。我问是因为
- 我喜欢它的工作方式并希望利用它的功能,但是
- 我通常需要进行业务验证,除了通常的基于DataAnnotations的验证之外,还需要与数据库通信。我可以在
IValidatableObject.Validate
方法中创建和处置我的 L2SDataContext
,但这似乎违背了将服务和数据上下文注入控制器的 DI 模式(与我的函数程序员将我的服务编写为静态方法的诱惑作斗争,这些方法本身创建和处置数据上下文!
请注意,我没有使用任何 MVC 客户端验证功能(我将所有 POST 都作为 ajax 执行,所以我从未看到客户端验证有任何真正的好处(。
首先,验证:
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);
}
}