5

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

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时调用它,并正确显示客户端验证程序,但在模型绑定到控制器时不会再次调用它。

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

UPDATE

自定义验证正常工作当对象被发布到一个控制器,但是当贴到ApiController不会被解雇。

+0

对不起,我发布了在其他问题的意见没有意识到这是你的问题!据我所知,API控制器和标准控制器使用单独的模型绑定器,因此问题可能是由于未将验证器正确添加到正确的模型绑定器中。目前没有在我的电脑上,但我会稍后看看它:) – Henry 2012-08-22 12:37:53

+0

@HenryGarle是的,我刚刚测试过这一点,自定义验证发布到控制器时,但不是ApiController。不知道如何为ApiController正确注册它。 – Dave 2012-08-22 14:31:08

+0

好吧,这是一个好的开始,而不是从ModelValidatorProvider继承有什么区别? – Henry 2012-08-22 15:31:15

回答

3

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

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