使用自定义DataAnnotationsModelValidatorProvider进行服务器端验证
我已经设置了一个自定义提供程序,允许从数据存储而不是静态代码中设置验证属性。 在我的.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时调用它,并正确显示客户端验证程序,但在模型绑定到控制器时不会再次调用它。
我错过了一个步骤? 任何帮助是极大的赞赏!
UPDATE
自定义验证程序在将对象发布到Controller时正常工作,但在发布到ApiController时不会被触发。
我终于明白了这一点,这是一个非常简单的答案。 ApiControllers只响应System.Web.Http.Validation命名空间中的提供程序,而不是用于常规控制器和客户端验证的System.Web.Mvc命名空间。
我同时实现了在ApiControllers中实现客户端验证和服务器验证。
链接地址: http://www.djcxy.com/p/56647.html上一篇: Server side validation with custom DataAnnotationsModelValidatorProvider
下一篇: Unable to set membernames from custom validation attribute in MVC2