C# 如何手动调用DataAnnotationsModelValidatorProvider(禁用后)?

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模式背道而驰,因为我的功能性程序员试图将我的服务作为静态方法来编写,而这些静态方法

禁用应用程序范围的自动验证后,如何手动执行DataAnnotationsModelValidatorProvider的工作。我问是因为

我喜欢它的工作方式,希望利用它的功能,但是 除了通常的基于数据注释的验证之外,我通常还需要进行业务验证,这需要与数据库进行对话。我可以在IValidatableObject.Validate方法中创建和处理L2S DataContext,但这似乎与将服务和数据上下文注入控制器的DI模式背道而驰,因为我的功能性程序员试图将我的服务作为静态方法来编写,而这些静态方法本身创建和处理数据上下文!。 请注意,我没有使用任何MVC客户端验证功能,所有文章都是作为ajax完成的,因此我从未见过客户端验证的任何真正好处。

首先,验证:

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,并将所有验证责任转移到了我的服务上。