5

我已经设置了一个自定义提供程序,以允许从数据存储而不是静态代码中设置验证属性。在我的 .NET MVC 4 项目中非常适合客户端验证,但我无法让服务器端验证正常工作。

CustomModelValidatorProvider .cs:

    公共类 CustomModelValidatorProvider : DataAnnotationsModelValidatorProvider
    {
        protected override IEnumerable GetValidators(ModelMetadata 元数据,ControllerContext 上下文,IEnumerable 属性)
        {
            // 在此处从数据存储区设置属性

            返回 base.GetValidators(元数据、上下文、属性);
        }
    }

在我的 Global.asax.cs 我有:

    受保护的无效 Application_Start()
    {
        ModelValidatorProviders.Providers.Clear();
        ModelValidatorProviders.Providers.Add(new CustomModelValidatorProvider());
    }

在 Web API 方法中,我有:

    var validationResultList = new List();
    bool valid = Validator.TryValidateObject(myModelObject, new ValidationContext(myModelObject, null, null), validationResultList, true);

在这里,valid 总是正确的。即使 Jquery 客户端验证显示错误。在服务器端,我的自定义提供程序未用于应用数据注释。当我在 GetValidators() 中设置断点时,它会在创建视图并正确显示客户端验证器时调用,但在模型绑定到控制器时不会再次调用。

我错过了一步吗?任何帮助是极大的赞赏!

更新

自定义验证器在对象发布到 Controller 时正常工作,但在发布到 ApiController 时不会被触发。

4

1 回答 1

3

我终于想通了,这是一个非常简单的答案。ApiController 仅响应 System.Web.Http.Validation 命名空间中的提供程序,而不是用于常规控制器和客户端验证的 System.Web.Mvc 命名空间。

我实现了两者以在 ApiControllers 中实现客户端验证和服务器验证。

于 2012-08-31T01:27:17.833 回答