【发布时间】:2012-07-31 21:18:14
【问题描述】:
我已经设置了一个自定义提供程序,以允许从数据存储而不是在静态代码中设置验证属性。在我的 .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() 中设置断点时,会在创建视图并正确显示客户端验证器时调用它,但在模型绑定到控制器时不会再次调用它。
我错过了一步吗?非常感谢任何帮助!
更新
自定义验证器在对象发布到控制器时正常工作,但在发布到 ApiController 时不会被触发。
【问题讨论】:
-
抱歉,我在另一个问题中发表了评论,但没有意识到这是您的问题!据我所知,API 控制器和标准控制器使用单独的模型绑定器,因此问题可能源于未正确将验证器添加到正确的模型绑定器。目前不在我的电脑上,但我稍后会查看它:)
-
@HenryGarle 是的,我刚刚对此进行了测试,自定义验证在发布到控制器时确实有效,但不是 ApiController。不确定如何为 ApiController 正确注册。
-
好的,这是一个好的开始,从 ModelValidatorProvider 继承有什么不同吗?
-
或者可能是这样的(在 RegisterRoutes() 全局中) GlobalConfiguration.Configuration.ServiceResolver.SetService(typeof(System.Web.Http.Validation.ModelValidatorProvider), new CustomModelValidatorProvider());如果这对您有任何帮助,如果您不介意,我会将其写成答案:)
-
@henry-garle 还没有运气。我试过 GlobalConfiguration.Configuration.Services.Add(typeof(System.Web.Mvc.DataAnnotationsModelValidator), new DAL.CustomModelValidatorProvider());但出现运行时错误 CustomModelValidatorProvider 类型必须派生自 DataAnnotationsModelValidator。参数名称:服务。不幸的是,当我搜索此主题时,我找不到太多信息
标签: c# asp.net-mvc asp.net-web-api data-annotations model-validation