5

我正在尝试IValidatableObject在 web api 2 上下文中使用验证。该Validate方法被调用,但ValidationContext传递的参数有一个调用的方法,该方法GetService始终返回 null,因为从未设置验证上下文的服务提供者。

根据我的所有研究,我们可以在 MVC 框架中轻松配置它,但我没有找到任何关于如何在 web api 2 中配置它的信息。

在验证传递给 的模型时,我们如何将服务提供者设置为验证上下文ApiController

4

1 回答 1

5

好的,我找到了解决方案。

我遇到的问题是我试图完全替换DataAnnotationsModelValidatorProvider,但框架不支持。最后,我必须在适当的位置寻找当前的工厂,然后注册我的自定义工厂,这将设置将在IValidatableObject.

要记住的一个重要注意事项,有多个名称空间DataAnnotationsModelValidatorProvider,但我需要的是System.Web.Http.Validation.Providers.DataAnnotationsModelValidatorProvider

这是它的样子:

private static void SetupIoCInValidationContext(
        IServiceProvider serviceProvider)
    {
        IEnumerable<ModelValidatorProvider> modelValidatorProviders =
            GlobalConfiguration
            .Configuration.Services.GetModelValidatorProviders();

        DataAnnotationsModelValidatorProvider provider =
            (DataAnnotationsModelValidatorProvider)
                modelValidatorProviders.Single(
                    x =>
                        x.GetType()
                            .IsTypeOf(
                                typeof(DataAnnotationsModelValidatorProvider)));

        provider.RegisterDefaultAdapterFactory((providers, attribute) =>
            new CustomDataAnnotationsModelValidator(providers, attribute,
                serviceProvider));

        provider.RegisterDefaultValidatableObjectAdapterFactory(
            providers => new CustomValidatableObjectAdapter(providers, serviceProvider)
            );
    }
于 2016-01-20T14:14:23.360 回答