1

我已经在为我的模型使用 Enterprise Library 5 验证(也用于 WCF 方法),所以我决定要避免使用 DataAnnotations 的 ASP.NET 4 MVC 中的冗余验证器。

但似乎 MVC 不会自动选择 Enterprise Library Validators。

如果我使用 MVC DataAnnotations:

[RegularExpression(MyValidationExpressions.Email, ErrorMessage = MyValidationMessages.InvalidEmailMessage)]
public virtual string Email { get; set; }

HTML 包含 data-val-regex-pattern 并且该字段正在客户端验证。

但是如果我使用现有的基于 EL 的验证:

 [RegexValidator(MyValidationExpressions.Email, MessageTemplate = MyValidationMessages.EmptyFieldMessage))]
 public virtual string Email { get; set; }

它不会在客户端显示验证错误,并且生成的 HTML 没有任何验证属性。

我在这里缺少什么,如何强制 MVC 在客户端和服务器端使用现有的 EL 验证器?

解决方案

我接受了完全迁移到 DataAnnotations 的解决方案。这是最简单的方法,它适用于 EntLib 5 和 MVC 4。但是 ValidationFactory 有一个小问题 - 我必须用 CreateValidator 和特定标志替换 CreateValidatorFromAttributes。有关 DataAnnotations 如何与 ValidationFactory 一起使用的说明,请参阅本文:

CreateValidatorFromAttributes 不使用 DataAnnotations 属性

DataAnnotations 还具有 [Required] 属性,可以很好地处理空字符串和仅包含空格的字符串。VAB 上存在一些问题。

4

2 回答 2

2

您可以ModelValidatorProvider为企业库验证创建一个。Brad Wilson 有一篇博客文章描述了如何做到这一点。

但是,看起来这只会执行服务器端验证。如果您使用的属性与 DataAnnotations 非常相似,我建议您改用它们。

于 2012-09-14T12:20:28.267 回答
1

这不起作用的原因是因为 VABRegexValidatorAttribute不是从 继承System.ComponentModel.DataAnnotations.RegularExpressionAttribute,而是直接从ValidationAttribute. 因为这个 MVC 不知道如何处理它。

有一种方法可以改变 MVC 进行这种处理的方式,但我不知道如何。但是你为什么不直接RegexValidatorAttribute用 DataAnnotations'代替使用RegularExpressionAttribute呢?验证应用程序块 5 能够处理 DataAnnotations 属性,因此如果 DataAnnotations 属性有效,只需使用它们。

于 2012-09-14T12:11:05.060 回答