Question

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?

Was it helpful?

Solution

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 :-))

OTHER TIPS

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

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top