我的任务是在表单上执行验证哪些字段是动态构造的(在数据库查询时)。我想使用数据注释。虽然模型是动态的,但我无法使用注释来修饰属性,但我可以使用自定义元数据提供程序,例如继承自DataAnnotationsModelMetadataProvider。
在Application_start的global.asax中,我提供了自己的MetaDataProvider:
ModelMetadataProviders.Current = new MetadataProvider.CustomModelMetadataProvider();
我做了一点点黑客,因为ModelMetadataProviders.Current是每个应用程序,我的问题需要在每个请求中提供不同的元数据,但它并不那么难。
这对于模拟IsRequired属性很好,因为元数据提供程序使用System.Web.Mvc.ModelMetadata并且存在IsRequired属性,但是没有诸如RegularExpression之类的属性或类似的属性。
所以我运行调试器并查看原始DataAnnotationsModelMetadataProvider为具有RegularExpression属性的属性返回的ModelMetadata,并且我还没有在那里找到正则表达式。
我很想得到一些暗示。
答案 0 :(得分:1)
我找到了答案(通过检查MVC 3源代码),如下所示:
ModelValidatorProvider
,例如继承自DataAnnotationsModelValidatorProvider
GetValidators
方法ModelValidatorProviders
。提供程序集合 GetValidators
方法返回IEnumerable<ModelValidator>
,因此足以返回RegularExpressionAttributeAdapter
的{{1}}。