开发者

ASP.Net MVC 2 Model Validation Regex Validator fails

I have following property in my Model Metadata class:

[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; }

But whenever I call ModelState.IsValid it always returns false because 开发者_开发问答regex is not validating. I have matched the entered date (08/29/2010) against new regex using same pattern and it matches perfectly.

What am I doing wrong?


Actualy there is another workaround for this. You can simply subclass the 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;
        }
}

in your Global.asax.cs on application start register the RegularExpression addapter for client side validation like so:

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

Now you get to have the build-in MVC regular exression validator client side and keep the DateTime as your property type


That's because regex applies to strings and not DateTime properties. If the user enters an invalid string which cannot be parsed to a DateTime instance from the model binder it will add a generic error message before your regex pattern executes.

You have a couple of possibilities:

  1. Customize the error message in a resource file
  2. Write a custom model binder
  3. Use a string property (I feel guilty for proposing this :-))
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜