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

时间:2011-11-04 19:33:02

标签: c# asp.net-mvc data-annotations

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

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

ModelMetadataProviders.Current = new MetadataProvider.CustomModelMetadataProvider();

我做了一点点黑客,因为ModelMetadataProviders.Current是每个应用程序,我的问题需要在每个请求中提供不同的元数据,但它并不那么难。

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

所以我运行调试器并查看原始DataAnnotationsModelMetadataProvider为具有RegularExpression属性的属性返回的ModelMetadata,并且我还没有在那里找到正则表达式。

我很想得到一些暗示。

1 个答案:

答案 0 :(得分:1)

我找到了答案(通过检查MVC 3源代码),如下所示:

  1. 创建自定义ModelValidatorProvider,例如继承自DataAnnotationsModelValidatorProvider
  2. 覆盖GetValidators方法
  3. 将自定义提供程序添加到ModelValidatorProviders。提供程序集合
  4. GetValidators方法返回IEnumerable<ModelValidator>,因此足以返回RegularExpressionAttributeAdapter的{​​{1}}。