我已经设置了一个自定义提供程序,以允许从数据存储而不是静态代码中设置验证属性。在我的 .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() 中设置断点时,它会在创建视图并正确显示客户端验证器时调用,但当模型绑定到控制器时不会再次调用。
我是不是漏掉了一步?任何帮助是极大的赞赏!
UPDATE
当对象被发布到 Controller 时,自定义验证器可以正常工作,但当被发布到 ApiController 时,自定义验证器不会被触发。