C# 如何手动调用DataAnnotationsModelValidatorProvider(禁用后)?
禁用应用程序范围的自动验证后,如何手动执行DataAnnotationsModelValidatorProvider的工作。我问是因为 我喜欢它的工作方式,希望利用它的功能,但是 除了通常的基于数据注释的验证之外,我通常还需要进行业务验证,这需要与数据库进行对话。我可以在IValidatableObject.Validate方法中创建和处理L2S DataContext,但这似乎与将服务和数据上下文注入控制器的DI模式背道而驰,因为我的功能性程序员试图将我的服务作为静态方法来编写,而这些静态方法本身创建和处理数据上下文!。 请注意,我没有使用任何MVC客户端验证功能,所有文章都是作为ajax完成的,因此我从未见过客户端验证的任何真正好处。首先,验证:C# 如何手动调用DataAnnotationsModelValidatorProvider(禁用后)?,c#,asp.net-mvc,asp.net-mvc-3,validation,C#,Asp.net Mvc,Asp.net Mvc 3,Validation,禁用应用程序范围的自动验证后,如何手动执行DataAnnotationsModelValidatorProvider的工作。我问是因为 我喜欢它的工作方式,希望利用它的功能,但是 除了通常的基于数据注释的验证之外,我通常还需要进行业务验证,这需要与数据库进行对话。我可以在IValidatableObject.Validate方法中创建和处理L2S DataContext,但这似乎与将服务和数据上下文注入控制器的DI模式背道而驰,因为我的功能性程序员试图将我的服务作为静态方法来编写,而这些静态方法
var validation = new List<ValidationResult>();
bool valid = Validator.TryValidateObject(value, new ValidationContext(value, null, null), validation, validateAllProperties: true);
然后,将结果复制到ModelState:
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);
}
}
是的,谢谢@Max,这看起来可以用了。但实际上,我最终转向了FluentValidation,并将所有验证责任转移到了我的服务上。