【问题标题】:Server side validation with custom DataAnnotationsModelValidatorProvider使用自定义 DataAnnotationsModelValidatorProvider 进行服务器端验证
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-03
    • 1970-01-01
    • 2011-11-11
    • 1970-01-01
    相关资源
    最近更新 更多