使用自定义DataAnnotationsModelValidatorProvider进行服务器端验证

时间:2012-08-02 20:33:58

标签: c# asp.net-mvc asp.net-web-api data-annotations model-validation

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

CustomModelValidatorProvider .cs:


    public class CustomModelValidatorProvider : DataAnnotationsModelValidatorProvider
    {
        protected override IEnumerable GetValidators(ModelMetadata metadata, ControllerContext context, IEnumerable attributes)
        {
            // set attributes from datastore here

            return base.GetValidators(metadata, context, attributes);
        }
    }

在我的Global.asax.cs中,我有:


    protected void 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);

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

我错过了一步吗?非常感谢任何帮助!

更新

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

1 个答案:

答案 0 :(得分:3)

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

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