动态表单验证 - CustomMetadataProvider 中的 RegularExpressionAttribute 模拟

发布于 2024-12-14 06:59:16 字数 679 浏览 2 评论 0原文

我的任务是对动态构造字段的表单执行验证(根据数据库查询)。我想使用数据注释。虽然模型是动态的,但我无法使用注释来装饰属性,但我可以使用自定义元数据提供程序,例如从 DataAnnotationsModelMetadataProvider 继承。

只需在 Application_start 的 global.asax 中,我提供了自己的 MetaDataProvider:

ModelMetadataProviders.Current = new MetadataProvider.CustomModelMetadataProvider();

我做了一些修改,因为 ModelMetadataProviders.Current 是针对每个应用程序的,我的问题需要在每个请求中提供不同的元数据,但这并不难。

这对于模拟 IsRequired 属性来说效果很好,因为元数据提供程序使用 System.Web.Mvc.ModelMetadata 并且有 IsRequired 属性,但没有诸如 RegularExpression 或类似属性之类的属性。

因此,我运行调试器并查看原始 DataAnnotationsModelMetadataProvider 返回的 ModelMetadata 中是否有具有 RegularExpression 属性的属性,但无论如何我都没有在那里找到正则表达式。

我很想得到一些提示。

My task is to perform validation on form which fields are constructed dynamically(upon database query). I would like to use data annotations. While model is dynamic I can't decorate properties with annotations, but I can use custom metadata provider for example inheriting from DataAnnotationsModelMetadataProvider.

Simply in global.asax at Application_start I supplied my own MetaDataProvider:

ModelMetadataProviders.Current = new MetadataProvider.CustomModelMetadataProvider();

I made a little hack, cause ModelMetadataProviders.Current is per application, my problem needed serving different metadata in each request, but it was not so hard.

This work fine for emulating IsRequired attribute, because metadata provider uses System.Web.Mvc.ModelMetadata and there is IsRequired property , but there is no property such as RegularExpression or anything similar.

So I run debugger and looked at ModelMetadata returned by original DataAnnotationsModelMetadataProvider for property with RegularExpression attribute, and I hadn't found regular expression there anyway.

I would love to get some hints on that.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

別甾虛僞 2024-12-21 06:59:16

我想出答案(通过检查 MVC 3 源代码)如下:

  1. 创建自定义 ModelValidatorProvider 例如从 DataAnnotationsModelValidatorProvider 继承
  2. 覆盖 GetValidators 方法
  3. 添加 yout ModelValidatorProviders.Providers 集合

GetValidators 方法返回 IEnumerable 的自定义提供程序,因此它足以返回从ModelValidator继承的RegularExpressionAttributeAdapter

I figured answer (by inspecting MVC 3 source code) which is as follows:

  1. create custom ModelValidatorProvider for example inheriting from DataAnnotationsModelValidatorProvider
  2. override GetValidators method
  3. add yout custom provider to ModelValidatorProviders.Providers collection

GetValidators method returns IEnumerable<ModelValidator> so its enough to return RegularExpressionAttributeAdapter which inhertis from ModelValidator.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文