I have a property of type DateTime MyDate in my ViewModel. I want to make sure that the user only enters the Date part in a text box in a specific format (dd.mm.yyyy) and tried the following attributes:
[DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode=true)]
[RegularExpression(@"^(([0-2]\d|[3][0-1])\.([0]\d|[1][0-2])\.[2][0]\d{2})$",
ErrorMessage="Failed...")]
public DateTime MyDate { get; set; }
The controller action signature for a HttpPost looks like this:
[HttpPost]
public ActionResult Edit(int id, MyViewModel viewModel)
{
// MyViewModel contains the MyDate property ...
// ...
if (ModelState.IsValid)
{
// ...
}
// ...
}
In the Razor view I tried the following two ways:
@Html.TextBoxFor(model => model.MyDate)@Html.EditorFor(model => model.MyDate)
It doesn't work as I want. The result is:
- Client side validation works as expected with both Html helpers
- Server side validation always fails for both helpers, even with valid dates like "17.06.2011" which pass the regular expression. The
MyDateproperty is filled correctly with the entered date inviewModelwhich is passed to the action. So it seems that model binding was working. - The
DisplayFormatattribute is only respected byEditorForbut not byTextBoxFor.TextBoxFordisplays "dd.mm.yyyy hh:mm:ss"
Questions:
Can I apply a
RegularExpressionAttributeat all on a property which isn't astring? If it is allowed how is the reg ex evaluated for a non-string property likeDateTimeon server side? Is something likeMyDate.ToString()compared with the reg ex? (It would explain that the validation fails because ToString will return a string including time part which doesn't pass the regular expression.)Is the
DisplayFormatattribute generally only respected byEditorForand never byTextBoxFor?How can I do a date validation right?