【问题标题】:ASP.Net MVC 2 Model Validation Regex Validator failsASP.Net MVC 2 模型验证正则表达式验证器失败
【发布时间】:2010-11-25 00:07:52
【问题描述】:

我的模型元数据类中有以下属性:

[Required(ErrorMessage = "Spent On is required")]
[RegularExpression(@"[0-1][0-9]/[0-3][0-9]/20[12][0-9]", 
   ErrorMessage = "Please enter date in mm/dd/yyyy format")]
[DataType(DataType.Date)]
[DisplayName("Spent On")]
public DateTime SpentOn { get; set; }

但每当我调用 ModelState.IsValid 时,它总是返回 false,因为正则表达式没有进行验证。我已使用相同的模式将输入的日期(08/29/2010)与新的正则表达式匹配,并且完美匹配。

我做错了什么?

【问题讨论】:

    标签: asp.net-mvc-2 validation model-validation


    【解决方案1】:

    实际上还有另一种解决方法。您可以简单地将 RegularExpressionAttribute 子类化

    public class DateFormatValidatorAttribute : RegularExpressionAttribute {
        public DateFormatValidatorAttribute()
            : base(@"[0-1][0-9]/[0-3][0-9]/20[12][0-9]") 
            {
                ErrorMessage = "Please enter date in mm/dd/yyyy format";
            }
    
            public override bool IsValid(object value) {
                return true;
            }
    }
    

    在应用程序的 Global.asax.cs 中开始注册正则表达式插件以进行客户端验证,如下所示:

    DataAnnotationsModelValidatorProvider.RegisterAdapter(
                typeof(DateFormatValidatorAttribute), 
                    typeof(RegularExpressionAttributeAdapter));
    

    现在您可以使用内置的 MVC 正则表达式验证器客户端并将 DateTime 作为您的属性类型

    【讨论】:

      【解决方案2】:

      这是因为正则表达式适用于字符串而不是 DateTime 属性。如果用户输入了一个无法从模型绑定器解析为 DateTime 实例的无效字符串,它将在您的正则表达式模式执行之前添加一条通用错误消息。

      您有几种可能性:

      1. Customize the error message 在资源文件中
      2. 编写自定义模型绑定器
      3. 使用字符串属性(我为此感到内疚:-))

      【讨论】:

      • 啊哈,@Darin 它正在将DateTime 转换为String,这不是给它MM/dd/yyyy 谢谢亲爱的!我将开发新的ValidationAttribute,因为该字段还需要一些其他验证。